From f2b8910b5d63454834552026311bafbafb7546d1 Mon Sep 17 00:00:00 2001 From: Fikri Milano Date: Fri, 20 Dec 2024 16:31:11 +0700 Subject: [PATCH 1/7] Add missing Indonesian translation (#3668) --- .../engine/src/main/res/values-in/strings.xml | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/android/engine/src/main/res/values-in/strings.xml b/android/engine/src/main/res/values-in/strings.xml index 9e674f4fc5..d7d55b464b 100644 --- a/android/engine/src/main/res/values-in/strings.xml +++ b/android/engine/src/main/res/values-in/strings.xml @@ -1,9 +1,12 @@ Sinkronisasi manual + Sinkronkan Bahasa Keluar sebagai Tampilkan yang terlambat Cari nama atau nomor ID + Cari nama + SINKRONKAN DATA PINDAI BARCODE Tidak Ada Hasil Maaf, kami tidak dapat menemukan klien dengan nama atau nomor ID tersebut @@ -65,12 +68,15 @@ Apakah Anda yakin ingin membuang jawabannya? Buang perubahan Buang - Simpan sebagian draf + Simpan sebagai draf Batal + Batalkan Perubahan Ya Detail yang diberikan mengalami kesalahan validasi. Atasi kesalahan dan kirim lagi Validasi Gagal OK + Buka draf + Hapus draf Username Password Lupa Password @@ -123,6 +129,7 @@ PELAYANAN SELANJUTNYA KARTU PELAYANAN Pasien lainnya + Pilih lokasi RESPONS (%1$s) Mencoba masuk dengan pengguna lain Mohon tunggu... @@ -144,6 +151,7 @@ Pekan/minggu Hari Menginisiasi pengaturan … + Initializing application … e.g JohnDoe %1$d%% Ada yang salah... @@ -157,6 +165,7 @@ Info perangkat Muat ulang Resources Tidak Disinkronkan + Semua data telah tersinkronisasi Statistik Tersinkronisasi Semua data disinkronkan Diperlukan pengaturan pengguna. Aktifkan koneksi internet Anda @@ -175,4 +184,25 @@ Tanggal Perangkat Versi migrasi data + Oke + TAMBAH + Memulai migrasi data dari versi %1$d + Data aplikasi berhasil dimigrasikan ke versi %1$d + Bantu + Tidak ada data yang disetel + Sinkronisasi selesai + Kesalahan sinkronisasi + Menghitung sisa waktu dalam menit… + %1$d%% Sinkronisasi ke atas… + %1$d%% Sinkronisasi ke bawah… + COBA LAGI + Ada beberapa data yang belum tersinkronisasi + Kontak supervisor hilang atau nomor telepon yang diberikan tidak valid + TERAPKAN FILTER + Simpan perubahan draf + Apakah Anda ingin menyimpan perubahan draf? + Buka perubahan draf + Anda dapat membuka kembali formulir draf yang disimpan untuk melanjutkan atau menghapusnya + Berikutnya + Sebelumnya From 3c3dea1decbaca441f33d5f48146a8eaccd3f799 Mon Sep 17 00:00:00 2001 From: Benjamin Mwalimu Date: Fri, 20 Dec 2024 16:56:26 +0300 Subject: [PATCH 2/7] =?UTF-8?q?=F0=9F=90=9B=20Add=20row=20weights=20to=20t?= =?UTF-8?q?he=20fix=20top=20bar=20icons=20being=20hidden=20when=20text=20i?= =?UTF-8?q?s=20too=20big=20(#3669)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 🐛 Add Row weights to the top bar * ⬆️ Update the app version --- android/buildSrc/src/main/kotlin/BuildConfigs.kt | 4 ++-- .../fhircore/quest/ui/main/components/TopScreenSection.kt | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/android/buildSrc/src/main/kotlin/BuildConfigs.kt b/android/buildSrc/src/main/kotlin/BuildConfigs.kt index b4ac17129a..7b8368968e 100644 --- a/android/buildSrc/src/main/kotlin/BuildConfigs.kt +++ b/android/buildSrc/src/main/kotlin/BuildConfigs.kt @@ -2,8 +2,8 @@ object BuildConfigs { const val minSdk = 26 const val compileSdk = 34 const val targetSdk = 34 - const val versionCode = 11 - const val versionName = "2.0.1" + const val versionCode = 12 + const val versionName = "2.0.2" const val applicationId = "org.smartregister.opensrp" const val jvmToolchain = 17 const val kotlinCompilerExtensionVersion = "1.5.8" diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/main/components/TopScreenSection.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/main/components/TopScreenSection.kt index 29c14d7acc..cf12ec2645 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/main/components/TopScreenSection.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/main/components/TopScreenSection.kt @@ -146,7 +146,7 @@ fun TopScreenSection( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceBetween, ) { - Row(verticalAlignment = Alignment.CenterVertically) { + Row(verticalAlignment = Alignment.CenterVertically, modifier = Modifier.weight(4f)) { Icon( when (toolBarHomeNavigation) { ToolBarHomeNavigation.OPEN_DRAWER -> Icons.Filled.Menu @@ -169,7 +169,7 @@ fun TopScreenSection( Row( verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.padding(start = 8.dp), + modifier = Modifier.padding(start = 8.dp).weight(1f), ) { SetupToolbarIcons( menuIcons = topScreenSection?.menuIcons, @@ -412,7 +412,7 @@ private fun RenderMenuIcon( @Composable fun TopScreenSectionWithFilterItemOverNinetyNinePreview() { TopScreenSection( - title = "All Clients", + title = "All Clients All Clients All Clients All Clients All Clients", searchQuery = SearchQuery("Eddy"), filteredRecordsCount = 120, onSearchTextChanged = { _, _ -> }, From d68886fc813c94dd71932dd9d059c727e82abb4c Mon Sep 17 00:00:00 2001 From: Sharon Akinyi <79141719+sharon2719@users.noreply.github.com> Date: Sat, 21 Dec 2024 06:22:11 +0300 Subject: [PATCH 3/7] Add Composition.entry and Composition.focus (#3662) * Add Composition.entry and Composition.focus * Update changes * Run spotlessApply * Add testFetchNonWorkflowConfigResourcesWithAllEntry test * Add tests for entry and focus * refactor and fix id fetch * add test and guard for entry item with missing elements * refactor element guards --------- Co-authored-by: Peter Lubell-Doughtie Co-authored-by: Simon Njoroge --- .../configuration/ConfigurationRegistry.kt | 127 +++++++++++------ .../ConfigurationRegistryTest.kt | 134 +++++++++++++++++- 2 files changed, 216 insertions(+), 45 deletions(-) diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/ConfigurationRegistry.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/ConfigurationRegistry.kt index c8521b3f20..d1a749e05b 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/ConfigurationRegistry.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/ConfigurationRegistry.kt @@ -46,6 +46,7 @@ import org.hl7.fhir.r4.model.ImplementationGuide import org.hl7.fhir.r4.model.ListResource import org.hl7.fhir.r4.model.MetadataResource import org.hl7.fhir.r4.model.Parameters +import org.hl7.fhir.r4.model.Reference import org.hl7.fhir.r4.model.Resource import org.hl7.fhir.r4.model.ResourceType import org.hl7.fhir.r4.model.SearchParameter @@ -334,19 +335,19 @@ constructor( } } } else { - composition.retrieveCompositionSections().forEach { - if (it.hasFocus() && it.focus.hasReferenceElement() && it.focus.hasIdentifier()) { - val configIdentifier = it.focus.identifier.value - val referenceResourceType = it.focus.reference.substringBefore(TYPE_REFERENCE_DELIMITER) - if (isAppConfig(referenceResourceType) && !isIconConfig(configIdentifier)) { - val extractedId = it.focus.extractId() - try { - val configBinary = fhirEngine.get(extractedId) - configsJsonMap[configIdentifier] = configBinary.content.decodeToString() - } catch (resourceNotFoundException: ResourceNotFoundException) { - Timber.e("Missing Binary file with ID :$extractedId") - withContext(dispatcherProvider.main()) { configsLoadedCallback(false) } - } + composition.retrieveCompositionSections().forEach { sectionComponent -> + if (sectionComponent.hasFocus()) { + addBinaryToConfigsJsonMap( + sectionComponent.focus, + configsLoadedCallback, + ) + } + if (sectionComponent.hasEntry() && sectionComponent.entry.isNotEmpty()) { + sectionComponent.entry.forEach { entryReference -> + addBinaryToConfigsJsonMap( + entryReference, + configsLoadedCallback, + ) } } } @@ -354,6 +355,26 @@ constructor( configsLoadedCallback(true) } + private suspend fun addBinaryToConfigsJsonMap( + entryReference: Reference, + configsLoadedCallback: (Boolean) -> Unit, + ) { + if (entryReference.hasReferenceElement() && entryReference.hasIdentifier()) { + val configIdentifier = entryReference.identifier.value + val referenceResourceType = entryReference.reference.substringBefore(TYPE_REFERENCE_DELIMITER) + if (isAppConfig(referenceResourceType) && !isIconConfig(configIdentifier)) { + val extractedId = entryReference.extractId() + try { + val configBinary = fhirEngine.get(extractedId.toString()) + configsJsonMap[configIdentifier] = configBinary.content.decodeToString() + } catch (resourceNotFoundException: ResourceNotFoundException) { + Timber.e("Missing Binary file with ID :$extractedId") + withContext(dispatcherProvider.main()) { configsLoadedCallback(false) } + } + } + } + } + private fun isAppConfig(referenceResourceType: String) = referenceResourceType in arrayOf(ResourceType.Binary.name, ResourceType.Parameters.name) @@ -411,41 +432,30 @@ constructor( val parsedAppId = appId.substringBefore(TYPE_REFERENCE_DELIMITER).trim() val compositionResource = fetchRemoteCompositionByAppId(parsedAppId) compositionResource?.let { composition -> - composition - .retrieveCompositionSections() - .asSequence() - .filter { it.hasFocus() && it.focus.hasReferenceElement() } - .groupBy { section -> - section.focus.reference.substringBefore( - TYPE_REFERENCE_DELIMITER, - missingDelimiterValue = "", - ) + val compositionSections = composition.retrieveCompositionSections() + val sectionComponentMap = mutableMapOf>() + compositionSections.forEach { sectionComponent -> + if (sectionComponent.hasFocus() && sectionComponent.focus.hasReferenceElement()) { + val key = + sectionComponent.focus.reference.substringBefore( + delimiter = TYPE_REFERENCE_DELIMITER, + missingDelimiterValue = "", + ) + sectionComponentMap.getOrPut(key) { mutableListOf() }.apply { add(sectionComponent) } } - .filter { entry -> entry.key in FILTER_RESOURCE_LIST } - .forEach { entry: Map.Entry> -> - if (entry.key == ResourceType.List.name) { - processCompositionListResources(entry) - } else { - val chunkedResourceIdList = entry.value.chunked(MANIFEST_PROCESSOR_BATCH_SIZE) - - chunkedResourceIdList.forEach { sectionComponents -> - Timber.d( - "Fetching config resource ${entry.key}: with ids ${ - sectionComponents.joinToString( - ",", - ) - }", + if (sectionComponent.hasEntry() && sectionComponent.entry.isNotEmpty()) { + sectionComponent.entry.forEach { + val key = + it.reference.substringBefore( + delimiter = TYPE_REFERENCE_DELIMITER, + missingDelimiterValue = "", ) - fetchResources( - resourceType = entry.key, - resourceIdList = - sectionComponents.map { sectionComponent -> - sectionComponent.focus.extractId() - }, - ) - } + sectionComponentMap.getOrPut(key) { mutableListOf() }.apply { add(sectionComponent) } } } + } + + processCompositionSectionComponent(sectionComponentMap) // Save composition after fetching all the referenced section resources addOrUpdate(compositionResource) @@ -455,6 +465,35 @@ constructor( } } + private suspend fun processCompositionSectionComponent( + sectionComponentMap: Map>, + ) { + sectionComponentMap + .filter { entry -> entry.key in FILTER_RESOURCE_LIST } + .forEach { entry: Map.Entry> -> + if (entry.key == ResourceType.List.name) { + processCompositionListResources(entry) + } else { + val chunkedResourceIdList = entry.value.chunked(MANIFEST_PROCESSOR_BATCH_SIZE) + + chunkedResourceIdList.forEach { sectionComponents -> + Timber.d( + "Fetching config resource ${entry.key}: with ids ${ + sectionComponents.joinToString( + ",", + ) + }", + ) + fetchResources( + resourceType = entry.key, + resourceIdList = + sectionComponents.map { sectionComponent -> sectionComponent.focus.extractId() }, + ) + } + } + } + } + suspend fun fetchRemoteImplementationGuideByAppId( appId: String?, appVersionCode: Int?, diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/configuration/ConfigurationRegistryTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/configuration/ConfigurationRegistryTest.kt index b08d672b4c..730a08815a 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/configuration/ConfigurationRegistryTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/configuration/ConfigurationRegistryTest.kt @@ -24,6 +24,7 @@ import com.google.android.fhir.FhirEngine import com.google.android.fhir.SearchResult import com.google.android.fhir.datacapture.extensions.logicalId import com.google.android.fhir.db.ResourceNotFoundException +import com.google.android.fhir.get import com.google.android.fhir.search.Search import dagger.hilt.android.testing.HiltAndroidRule import dagger.hilt.android.testing.HiltAndroidTest @@ -52,6 +53,7 @@ import org.hl7.fhir.r4.model.ResourceType import org.hl7.fhir.r4.model.StructureMap import org.junit.Assert import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse import org.junit.Assert.assertNotNull import org.junit.Assert.assertThrows import org.junit.Assert.assertTrue @@ -617,7 +619,7 @@ class ConfigurationRegistryTest : RobolectricTest() { } returns Binary().apply { content = ByteArray(0) } runTest { configRegistry.loadConfigurations(appId, context) } - Assert.assertFalse(configRegistry.configsJsonMap.isEmpty()) + assertFalse(configRegistry.configsJsonMap.isEmpty()) } @Test @@ -1080,4 +1082,134 @@ class ConfigurationRegistryTest : RobolectricTest() { assertEquals(questionnaireId, questionnaire.logicalId) } } + + @Test + fun testFetchNonWorkflowConfigResourcesWithNoFocusOrEntry() = runTest { + val appId = "app-id" + val composition = + Composition().apply { + identifier = Identifier().apply { value = appId } + section = listOf(SectionComponent()) // Neither focus nor entry + } + + configRegistry.fetchNonWorkflowConfigResources() + + // Validate no crash occurs and configsJsonMap remains empty + assertTrue(configRegistry.configsJsonMap.isEmpty()) + } + + @Test + fun testPopulateConfigurationsMapWithNeitherFocusNorEntry() = runTest { + val composition = Composition() + + configRegistry.populateConfigurationsMap(context, composition, false, "app-id") {} + + assertTrue(configRegistry.configsJsonMap.isEmpty()) + } + + @Test + fun testPopulateConfigurationsMapWithAllFocus() = runTest { + val composition = + Composition().apply { + section = + listOf( + SectionComponent().apply { + focus = + Reference().apply { + reference = "Binary/1" + identifier = Identifier().apply { value = "resource1" } + } + }, + ) + } + + coEvery { fhirEngine.get(any()) } returns Binary().apply { content = ByteArray(0) } + configRegistry.populateConfigurationsMap(context, composition, false, "app-id") {} + assertEquals(1, configRegistry.configsJsonMap.size) + assertTrue(configRegistry.configsJsonMap.containsKey("resource1")) + } + + @Test + fun testPopulateConfigurationsMapWithAllEntry() = runTest { + val composition = + Composition().apply { + section = + listOf( + SectionComponent().apply { + entry = + listOf( + Reference().apply { + reference = "Binary/1" + identifier = Identifier().apply { value = "resource1" } + }, + Reference().apply { + reference = "Binary/2" + identifier = Identifier().apply { value = "resource2" } + }, + ) + }, + ) + } + + coEvery { fhirEngine.get(any()) } returns Binary().apply { content = ByteArray(0) } + configRegistry.populateConfigurationsMap(context, composition, false, "app-id") {} + assertEquals(2, configRegistry.configsJsonMap.size) + assertTrue(configRegistry.configsJsonMap.containsKey("resource1")) + assertTrue(configRegistry.configsJsonMap.containsKey("resource2")) + } + + @Test + fun testPopulateConfigurationsMapWithEntryMissingId() = runTest { + val composition = + Composition().apply { + section = + listOf( + SectionComponent().apply { + entry = + listOf( + Reference().apply { reference = "Binary/1" }, + Reference().apply { + reference = "Binary/2" + identifier = Identifier().apply { value = "resource2" } + }, + ) + }, + ) + } + + coEvery { fhirEngine.get(any()) } returns Binary().apply { content = ByteArray(0) } + configRegistry.populateConfigurationsMap(context, composition, false, "app-id") {} + assertEquals(1, configRegistry.configsJsonMap.size) + assertTrue(configRegistry.configsJsonMap.containsKey("resource2")) + } + + @Test + fun testPopulateConfigurationsMapWithFocusAndEntry() = runTest { + val composition = + Composition().apply { + section = + listOf( + SectionComponent().apply { + focus = + Reference().apply { + reference = "Binary/1" + identifier = Identifier().apply { value = "resource1" } + } + entry = + listOf( + Reference().apply { + reference = "Binary/2" + identifier = Identifier().apply { value = "resource2" } + }, + ) + }, + ) + } + + coEvery { fhirEngine.get(any()) } returns Binary().apply { content = ByteArray(0) } + configRegistry.populateConfigurationsMap(context, composition, false, "app-id") {} + assertEquals(2, configRegistry.configsJsonMap.size) + assertTrue(configRegistry.configsJsonMap.containsKey("resource1")) + assertTrue(configRegistry.configsJsonMap.containsKey("resource2")) + } } From 022b0bf791a33e53cac81c9503a94e84ab49a36b Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Tue, 7 Jan 2025 14:39:23 +0300 Subject: [PATCH 4/7] Updates for file android/engine/src/main/res/values/strings.xml in fr (#3657) * Translate strings.xml in fr 100% translated source file: 'strings.xml' on 'fr'. * Fix typo in FR strings file * Update strings.xml - Fix typo in engine module FR string file --------- Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> Co-authored-by: Benjamin Mwalimu Co-authored-by: Martin Ndegwa --- android/engine/src/main/res/values-fr/strings.xml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/android/engine/src/main/res/values-fr/strings.xml b/android/engine/src/main/res/values-fr/strings.xml index c6da757598..f4370ff398 100644 --- a/android/engine/src/main/res/values-fr/strings.xml +++ b/android/engine/src/main/res/values-fr/strings.xml @@ -24,7 +24,7 @@ Synchronisation terminée Synchronisation Synchronisation… - Synchronisation en cours… + Synchronisation… Synchronisation initiée… La synchronisation a échoué. Vérifier la connexion internet ou réessayer plus tard La synchronisation s\'est terminée avec des erreurs. Réessayer... @@ -55,7 +55,7 @@ Réessayer la synchronisation Synchronisation en cours Chargement - Chargement… + Chargement Message d\'erreur de déconnexion %1$s Impossible de se déconnecter : Déjà déconnecté ou l\'appareil est hors ligne. Impossible de charger la configuration. Veuillez réessayer plus tard @@ -75,6 +75,8 @@ Des erreurs de validation ont été détectées. Corrigez les erreurs et soumettez à nouveau. Échec de la validation D\'ACCORD + Projet ouvert + Supprimer le projet Nom d\'utilisateur Mot de passe Mot de passe oublié @@ -184,4 +186,6 @@ APPLIQUER LE FILLTRE Enregistrer les modifications du brouillon Voulez-vous enregistrer les modifications du brouillon ? + Modifications du projet en cours + Vous pouvez rouvrir un projet de formulaire enregistré pour le poursuivre ou le supprimer From 0f1a3337e653da2416a5672ff3369574bccaf9b0 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Tue, 7 Jan 2025 19:24:46 +0300 Subject: [PATCH 5/7] Updates for file android/quest/src/main/res/values/strings.xml in fr (#3658) * Translate strings.xml in fr 100% translated source file: 'strings.xml' on 'fr'. * Update strings.xml * Spotless Apply --------- Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> Co-authored-by: Lentumunai Mark <90028422+Lentumunai-Mark@users.noreply.github.com> Co-authored-by: Benjamin Mwalimu Co-authored-by: Martin Ndegwa Co-authored-by: Martin Ndegwa --- android/quest/src/main/res/values-fr/strings.xml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/android/quest/src/main/res/values-fr/strings.xml b/android/quest/src/main/res/values-fr/strings.xml index c8d989da49..491e08ba69 100644 --- a/android/quest/src/main/res/values-fr/strings.xml +++ b/android/quest/src/main/res/values-fr/strings.xml @@ -119,6 +119,7 @@ La ressource de base pour la configuration du GeoWidget DOIT être l\'emplacement. Aucune configuration fournie pour la barre de recherche. Aucun emplacement trouvé correspondant au texte \"%1$s\" + Autre code_QR Demande d\'autorisation de caméra refusée. Le code-barres pourrait ne pas fonctionner comme prévu. Placez votre caméra sur le code QR pour commencer à scanner. @@ -133,6 +134,9 @@ Tous Les emplacements ont été rendus avec succès\" %1$d Les emplacements correspondants ont été rendus avec succès. Annuler l\'ajout de l\'emplacement + Erreur de rendu du profil + Êtes-vous sûr de vouloir soumettre? + Vous êtes sur le point de soumettre @@ -182,7 +186,6 @@ Autre - Saisissez une option personnalisée Ajouter une autre réponse Cochez toutes les cases qui s\'appliquent Sauvegardez From becf27f884054d3d9e57e30e142710000a967eb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=E2=89=A1ZRS?= <12814349+LZRS@users.noreply.github.com> Date: Thu, 9 Jan 2025 23:42:59 +0300 Subject: [PATCH 6/7] Add junit-platform-launcher dependency as described in docs (#3671) https://docs.gradle.org/8.5/userguide/upgrading_version_8.html#test_framework_implementation_dependencies --- android/gradle/libs.versions.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/android/gradle/libs.versions.toml b/android/gradle/libs.versions.toml index 90702e4b7c..8a5199492a 100644 --- a/android/gradle/libs.versions.toml +++ b/android/gradle/libs.versions.toml @@ -142,6 +142,7 @@ junit = { group = "androidx.test.ext", name = "junit", version.ref = "junit" } junit-jupiter-api = { group = "org.junit.jupiter", name = "junit-jupiter-api", version.ref = "junit-jupiter" } junit-jupiter-engine = { group = "org.junit.jupiter", name = "junit-jupiter-engine", version.ref = "junit-jupiter" } junit-ktx = { group = "androidx.test.ext", name = "junit-ktx", version.ref = "junit-ktx" } +junit-platform-launcher = { group = "org.junit.platform", name = "junit-platform-launcher"} junit-vintage-engine = { group = "org.junit.vintage", name = "junit-vintage-engine", version.ref = "junit-jupiter" } knowledge = { group = "org.smartregister", name = "knowledge", version.ref = "fhir-sdk-knowledge" } kotlin-gradle-plugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" } @@ -222,7 +223,7 @@ compose = ["activity-compose","activity-ktx", "ui", "ui-tooling-preview", "const compose-ui-test = ["ui-test-junit4","ui-test-manifest"] coroutines = ["kotlinx-coroutines-core", "kotlinx-coroutines-android"] datastore-kt = ["datastore-preferences", "datastore"] -junit-jupiter-runtime = ["junit-jupiter-engine","junit-vintage-engine"] +junit-jupiter-runtime = ["junit-platform-launcher", "junit-jupiter-engine","junit-vintage-engine"] junit-test = ["junit-ktx", "junit"] klint = ["ktlint-cli-ruleset", "ktlint-rule-engine-core"] lifecycle = ["lifecycle-viewmodel-ktx", "lifecycle-viewmodel-compose", "lifecycle-livedata-ktx"] From 7758c4304c7e01820d1e660bcd7efb1ebf889d00 Mon Sep 17 00:00:00 2001 From: Fikri Milano Date: Wed, 15 Jan 2025 15:07:10 +0700 Subject: [PATCH 7/7] Kader app logo and label update (#3677) * Change Kader app label * Change Kader logo in login page --- android/quest/build.gradle.kts | 2 +- .../kaderjobaids/res/drawable/ic_app_logo.png | Bin 19257 -> 13215 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/android/quest/build.gradle.kts b/android/quest/build.gradle.kts index 6baf09f5a1..cd1fc372fd 100644 --- a/android/quest/build.gradle.kts +++ b/android/quest/build.gradle.kts @@ -378,7 +378,7 @@ android { dimension = "apps" applicationIdSuffix = ".jobaids" versionNameSuffix = "-kaderjobaids" - manifestPlaceholders["appLabel"] = "Kader Job Aids" + manifestPlaceholders["appLabel"] = "Kader Kesehatan" } } diff --git a/android/quest/src/kaderjobaids/res/drawable/ic_app_logo.png b/android/quest/src/kaderjobaids/res/drawable/ic_app_logo.png index 8caf2e3da257c1cc2f31533235cd088271e980df..3a0f7e0617db9aad60d48c964cb301289ad3dcd6 100644 GIT binary patch literal 13215 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