Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -329,6 +329,7 @@ dependencies {
implementation(project(":commonskmm"))
implementation(project(":login"))
implementation(project(":sync"))
implementation(project(":jica_mch"))

implementation(libs.security.conscrypt)
implementation(libs.security.rootbeer)
Expand Down
11 changes: 11 additions & 0 deletions app/src/main/java/org/dhis2/usescases/main/MainNavigator.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import org.dhis2.usescases.main.program.ProgramFragment
import org.dhis2.usescases.qrReader.QrReaderFragment
import org.dhis2.usescases.settings.SyncManagerFragment
import org.dhis2.usescases.troubleshooting.TroubleshootingFragment
import org.jica.mch.ui.JicaMchFragment

class MainNavigator(
private var fragmentManager: FragmentManager,
Expand All @@ -32,6 +33,10 @@ class MainNavigator(
MainScreenType.Home(HomeScreen.Visualizations)
}

lastHomeFragment is JicaMchFragment -> {
MainScreenType.Home(HomeScreen.JicaMch)
}

else -> {
MainScreenType.Home(HomeScreen.Programs)
}
Expand Down Expand Up @@ -60,6 +65,12 @@ class MainNavigator(
beginTransaction(visualizationsFragment)
}

fun openJicaMch() {
val jicaMchFragment = JicaMchFragment()
lastHomeFragment = jicaMchFragment
beginTransaction(jicaMchFragment)
}

fun openSettings() {
beginTransaction(
SyncManagerFragment(),
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/java/org/dhis2/usescases/main/MainScreenType.kt
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,12 @@ sealed class MainScreenType : Parcelable {
fun isHome() = this is Home
fun isPrograms() = this is Home && this.homeScreen == HomeScreen.Programs
fun isVisualizations() = this is Home && this.homeScreen == HomeScreen.Visualizations
fun isJicaMch() = this is Home && this.homeScreen == HomeScreen.JicaMch
}

@Parcelize
sealed interface HomeScreen : Parcelable {
data object Programs : HomeScreen
data object Visualizations : HomeScreen
data object JicaMch : HomeScreen
}
2 changes: 2 additions & 0 deletions app/src/main/java/org/dhis2/usescases/main/MainViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -456,6 +456,8 @@ class MainViewModel(
matomoAnalyticsController.trackEvent(HOME, OPEN_ANALYTICS, CLICK)
mainNavigator.openVisualizations()
}

HomeScreen.JicaMch -> mainNavigator.openJicaMch()
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package org.dhis2.usescases.main.domain

import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.BarChart
import androidx.compose.material.icons.filled.ChildCare
import org.dhis2.R
import org.dhis2.commons.resources.ResourceManager
import org.dhis2.mobile.commons.domain.UseCase
Expand Down Expand Up @@ -35,6 +36,13 @@ class ConfigureHomeNavigationBar(
)
)
}
add(
NavigationBarItem(
id = NavigationPage.JICA_MCH,
icon = Icons.Filled.ChildCare,
label = resourceManager.getString(R.string.navigation_jica_mch),
),
)
}
Result.success(list)
} catch (_: DomainError) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ fun MainScreen(
when (navigationPage) {
NavigationPage.ANALYTICS -> onAction(HomeAction.ScreenChanged(MainScreenType.Home(HomeScreen.Visualizations)))
NavigationPage.PROGRAMS -> onAction(HomeAction.ScreenChanged(MainScreenType.Home(HomeScreen.Programs)))
NavigationPage.JICA_MCH -> onAction(HomeAction.ScreenChanged(MainScreenType.Home(HomeScreen.JicaMch)))
else -> { /*no op*/ }
}
}
Expand Down Expand Up @@ -217,6 +218,7 @@ fun HomeBottomBar(
when {
homeScreenState.currentScreen.isPrograms() -> 0
homeScreenState.currentScreen.isVisualizations() -> 1
homeScreenState.currentScreen.isJicaMch() -> 2
else -> null
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,5 @@ enum class NavigationPage(
TABLE_VIEW(R.id.navigation_table_view),
TASKS(R.id.navigation_tasks),
PROGRAMS(R.id.navigation_programs),
JICA_MCH(R.id.navigation_jica_mch),
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ interface NavigationPageConfigurator {
NavigationPage.TABLE_VIEW -> displayTableView()
NavigationPage.TASKS -> displayTasks()
NavigationPage.PROGRAMS -> displayPrograms()
NavigationPage.JICA_MCH -> displayJicaMch()
null -> false
}

Expand All @@ -41,5 +42,7 @@ interface NavigationPageConfigurator {

fun displayPrograms(): Boolean = false

fun displayJicaMch(): Boolean = false

fun navigationItems(): List<NavigationBarItem<NavigationPage>> = emptyList()
}
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,7 @@ class MainViewModelIntegrationTest {
}

@Test
fun `should show two nav items and bottom bar when analytics are configured`() = runTest {
fun `should show programs, analytics and jica 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
Expand All @@ -223,26 +223,27 @@ class MainViewModelIntegrationTest {
viewModel.homeScreenState.test {
awaitItem()
val state = awaitItem()
assertEquals(2, state.navigationBarItems.size)
assertEquals(3, state.navigationBarItems.size)
assertTrue(state.bottomNavigationBarVisible)
}
}

@Test
fun `should show one nav item and hide bottom bar when analytics are not configured`() = runTest {
fun `should show programs and jica nav items and 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
whenever(resourceManager.getString(any())) doReturn ""

buildViewModel()

viewModel.homeScreenState.test {
awaitItem()
val state = awaitItem()
assertEquals(1, state.navigationBarItems.size)
assertFalse(state.bottomNavigationBarVisible)
assertEquals(2, state.navigationBarItems.size)
assertTrue(state.bottomNavigationBarVisible)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ class ConfigureHomeNavigationBarTest {
fun setUp() {
whenever(resourceManager.getString(R.string.navigation_programs)) doReturn "Programs"
whenever(resourceManager.getString(R.string.navigation_charts)) doReturn "Analytics"
whenever(resourceManager.getString(R.string.navigation_jica_mch)) doReturn "Jica MCH"
configureHomeNavigationBar =
ConfigureHomeNavigationBar(
homeRepository = homeRepository,
Expand All @@ -32,22 +33,22 @@ class ConfigureHomeNavigationBarTest {
}

@Test
fun `should return programs and analytics items if configured`() =
fun `should return programs, analytics and jica items if configured`() =
runTest {
whenever(homeRepository.hasHomeAnalytics()) doReturn true
with(configureHomeNavigationBar()) {
assertTrue(isSuccess)
assertTrue(getOrNull()?.size == 2)
assertTrue(getOrNull()?.size == 3)
}
}

@Test
fun `should return just programs if analytics is not configured`() =
fun `should return programs and jica if analytics is not configured`() =
runTest {
whenever(homeRepository.hasHomeAnalytics()) doReturn false
with(configureHomeNavigationBar()) {
assertTrue(isSuccess)
assertTrue(getOrNull()?.size == 1)
assertTrue(getOrNull()?.size == 2)
}
}

Expand Down
6 changes: 6 additions & 0 deletions commons/src/main/res/menu/navigation_home_menu.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,10 @@
android:enabled="true"
android:icon="@drawable/ic_navigation_analytics"
android:title="@string/navigation_analytics"/>

<item
android:id="@+id/navigation_jica_mch"
android:enabled="true"
android:icon="@drawable/ic_navigation_forms"
android:title="@string/navigation_jica_mch"/>
</menu>
1 change: 1 addition & 0 deletions commons/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
<string name="navigation_analytics">Analytics</string>
<string name="navigation_tasks">Tasks</string>
<string name="navigation_programs">Programs</string>
<string name="navigation_jica_mch">Jica MCH</string>
<string name="navigation_relationships">Relationships</string>
<string name="navigation_relations">Relations</string>
<string name="navigation_notes">Notes</string>
Expand Down
50 changes: 50 additions & 0 deletions gradle/verification-metadata.xml
Original file line number Diff line number Diff line change
Expand Up @@ -264,6 +264,16 @@
<sha256 value="26726186b34f90b0fe55bbf0ebbf640ade99915bc35f4cb0153ddcf751499bd3" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.activity" name="activity" version="1.8.1">
<artifact name="activity-1.8.1.aar">
<sha256 value="66bc2c13bd91fb8ea09e445b21f784d3e5d3a9ec9b180cd07e0e9208c2f939c6" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.activity" name="activity" version="1.8.2">
<artifact name="activity-1.8.2.aar">
<sha256 value="ecc119262530a6e2f9f373207e472d476306bed3d4b216fe61b1ea42e3bef688" 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"/>
Expand All @@ -274,6 +284,11 @@
<sha256 value="03d5232a9371338475a3d9e40cabeb072faab16dd01d94b481c1ebf13535c59a" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.activity" name="activity-compose" version="1.8.2">
<artifact name="activity-compose-1.8.2.aar">
<sha256 value="5a67e984f14ed2afc585aa3a23edff1c1791c80caa2bf68a0f799c1b11a39038" 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"/>
Expand All @@ -284,11 +299,26 @@
<sha256 value="3663f6811a3c6c0c28f8ba82ba5e9f363f4bc12ee53155794f456d3c5b2acae3" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.activity" name="activity-ktx" version="1.8.1">
<artifact name="activity-ktx-1.8.1.aar">
<sha256 value="9f77caa2bbec7ceefa5c931e2f223c2b386a594ee0442d168dfeaf1c850aeb9d" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.activity" name="activity-ktx" version="1.8.2">
<artifact name="activity-ktx-1.8.2.aar">
<sha256 value="5c78283d1956b14b22cf6ad70c712a73aa084116b7535526176c3b85e6a9205a" 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.0">
<artifact name="annotation-experimental-1.4.0.aar">
<sha256 value="c6eb7e676011ec65b32428373d450debdfc45179c4f8b3a752174fb87c17b08a" 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"/>
Expand Down Expand Up @@ -959,6 +989,11 @@
<sha256 value="e1bd22bbcf5cee3a992dedb7d2d3c3b31c9f761c01e56d00ea443c8aaa981182" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.core" name="core" version="1.9.0">
<artifact name="core-1.9.0.aar">
<sha256 value="8bda3ee3a88887d54f6679fb6b6cd788629f73234ac91c8bbed924e721ec85b8" 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"/>
Expand All @@ -974,6 +1009,11 @@
<sha256 value="4d23190b8623b8abb3c5247a0a7727eca347062d026335c427a09e82711b15f8" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.core" name="core-ktx" version="1.9.0">
<artifact name="core-ktx-1.9.0.aar">
<sha256 value="1542a1df7be908c95fee91b8dbc03fd974f53f11d84a85d881f95a52551c4051" 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"/>
Expand Down Expand Up @@ -5226,6 +5266,11 @@
<sha256 value="e713f1f874244115a07571065cffa0f24f5e78300e9720fea16de3af1d75fd41" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jetbrains.kotlinx" name="kotlinx-coroutines-android" version="1.8.1">
<artifact name="kotlinx-coroutines-android-1.8.1.jar">
<sha256 value="a134dacf4e6578b29b32e97aa50548d09cb45e3cb3551ce77ac27e55e265d8f5" 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"/>
Expand All @@ -5251,6 +5296,11 @@
<sha256 value="9860906a1937490bf5f3b06d2f0e10ef451e65b95b269f22daf68a3d1f5065c5" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jetbrains.kotlinx" name="kotlinx-coroutines-core-jvm" version="1.8.1">
<artifact name="kotlinx-coroutines-core-jvm-1.8.1.jar">
<sha256 value="f3d4f5de1c391bbcc20f3b3435ccbac013521e76b6902d7d59635ec15c1f797e" 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"/>
Expand Down
1 change: 1 addition & 0 deletions jica_mch/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/build
65 changes: 65 additions & 0 deletions jica_mch/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
plugins {
alias(libs.plugins.kotlin.multiplatform)
alias(libs.plugins.compose)
alias(libs.plugins.android.kotlin.multiplatform.library)
alias(libs.plugins.kotlin.compose.compiler)
}

kotlin {

android {
namespace = "org.jica.mch"
compileSdk {
version = release(libs.versions.sdk.get().toInt())
}
minSdk = libs.versions.minSdk.get().toInt()

withHostTestBuilder {
}

withDeviceTestBuilder {
sourceSetTreeName = "test"
}.configure {
instrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
}

jvm("desktop")

sourceSets {
commonMain {
dependencies {
implementation(libs.compose.runtime)
implementation(libs.compose.foundation)
implementation(libs.compose.ui)
implementation(libs.compose.material3)
val designSystem = libs.dhis2.mobile.designsystem
implementation("${designSystem.get().group}:${designSystem.get().name}:${designSystem.get().version}") {
isChanging = true
}
}
}

androidMain {
dependencies {
implementation(libs.androidx.fragmentKtx)
implementation(libs.androidx.compose.preview)
implementation(libs.androidx.compose.uitooling)
}
}

getByName("androidDeviceTest") {
dependencies {
implementation(libs.test.junit.ext)
implementation(libs.test.testCore)
implementation(libs.test.testRunner)
}
}

val desktopMain by getting {
dependencies {
implementation(libs.compose.desktop.common)
}
}
}
}
4 changes: 4 additions & 0 deletions jica_mch/src/androidMain/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

</manifest>
Loading
Loading