Skip to content

Commit

Permalink
feat: implementing validation for rei program based on datastore conf…
Browse files Browse the repository at this point in the history
…ig keeping the default app flow (#16)
  • Loading branch information
CarlosMacaneta authored Oct 17, 2024
1 parent 46675b7 commit 9adf8cd
Show file tree
Hide file tree
Showing 28 changed files with 222 additions and 100 deletions.
2 changes: 1 addition & 1 deletion app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,7 @@ dependencies {
implementation(project(":stock-usecase"))
implementation(project(":dhis2-mobile-program-rules"))
implementation(project(":tracker"))
implementation(project(":support-module"))


implementation(libs.security.conscrypt)
implementation(libs.security.rootbeer)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,13 @@ package org.dhis2.data.dhislogic

import io.reactivex.Flowable
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.EnrollmentCollectionRepository
import org.hisp.dhis.android.core.event.EventCollectionRepository
import org.hisp.dhis.android.core.organisationunit.OrganisationUnit
import org.hisp.dhis.android.core.program.Program
import org.hisp.dhis.android.core.program.ProgramType
import org.hisp.dhis.android.core.trackedentity.TrackedEntityInstanceCollectionRepository
import org.saudigitus.rei.utils.Utils.datastorePrograms
import javax.inject.Inject

class DhisProgramUtils @Inject constructor(val d2: D2) {
Expand Down Expand Up @@ -45,7 +43,6 @@ class DhisProgramUtils @Inject constructor(val d2: D2) {

fun getProgramsInCaptureOrgUnits(): Flowable<List<Program>> {
return d2.programModule().programs()
.byUid().`in`(datastorePrograms(d2))
.withTrackedEntityType()
.byOrganisationUnitScope(OrganisationUnit.Scope.SCOPE_DATA_CAPTURE)
.get().toFlowable()
Expand Down
10 changes: 9 additions & 1 deletion app/src/main/java/org/dhis2/usescases/main/HomeNavigator.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import org.dhis2.usescases.main.program.ProgramUiModel
import org.dhis2.usescases.programEventDetail.ProgramEventDetailActivity
import org.dhis2.usescases.searchTrackEntity.SearchTEActivity
import org.hisp.dhis.android.core.program.ProgramType
import org.saudigitus.rei.ReiActivity

sealed class HomeItemData(
open val uid: String,
Expand All @@ -24,6 +25,7 @@ sealed class HomeItemData(
override val accessDataWrite: Boolean,
val trackedEntityType: String,
val stockConfig: AppConfig?,
val isRei: Boolean,
) : HomeItemData(uid, label, accessDataWrite)

data class EventProgram(
Expand Down Expand Up @@ -55,6 +57,7 @@ fun ProgramUiModel.toHomeItemData(): HomeItemData {
accessDataWrite,
type!!,
stockConfig,
isRei,
)

else -> HomeItemData.DataSet(
Expand Down Expand Up @@ -94,7 +97,12 @@ fun ActivityResultLauncher<Intent>.navigateTo(context: Context, homeItemData: Ho
}

is HomeItemData.TrackerProgram -> {
if (homeItemData.stockConfig != null) {
if (homeItemData.isRei) {
Intent(context, ReiActivity::class.java).apply {
putExtras(bundle)
launch(this)
}
} else if (homeItemData.stockConfig != null) {
Intent(context, HomeActivity::class.java).apply {
putExtra(
org.dhis2.android.rtsm.commons.Constants.INTENT_EXTRA_APP_CONFIG,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import org.hisp.dhis.android.core.category.CategoryOptionCombo
import org.hisp.dhis.android.core.program.ProgramType
import org.hisp.dhis.android.core.systeminfo.SystemInfo
import org.hisp.dhis.android.core.user.User
import org.saudigitus.rei.utils.Utils.isRei

class HomeRepositoryImpl(
private val d2: D2,
Expand Down Expand Up @@ -81,6 +82,7 @@ class HomeRepositoryImpl(
} else {
null
},
isRei = isRei(d2, program.uid()),
)

program?.programType() == ProgramType.WITHOUT_REGISTRATION ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,6 @@ 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.saudigitus.rei.ui.stages.StageViewModel
import org.saudigitus.rei.ui.stages.StageViewModelFactory
import timber.log.Timber
import javax.inject.Inject

Expand All @@ -41,17 +39,10 @@ class ProgramFragment : FragmentGlobalAbstract(), ProgramView {
@Inject
lateinit var programViewModelFactory: ProgramViewModelFactory

@Inject
lateinit var stageViewModelFactory: StageViewModelFactory

val programViewModel: ProgramViewModel by viewModels {
programViewModelFactory
}

val stageViewModel: StageViewModel by viewModels {
stageViewModelFactory
}

@Inject
lateinit var animation: ProgramAnimation

Expand Down Expand Up @@ -86,7 +77,6 @@ class ProgramFragment : FragmentGlobalAbstract(), ProgramView {
programViewModel.setIsDownloading()
}
ProgramList(
stageViewModel = stageViewModel,
downLoadState = state,
programs = items,
onItemClick = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ import org.dhis2.data.service.SyncStatusController
import org.hisp.dhis.android.core.D2
import org.saudigitus.rei.data.source.DataManager
import org.saudigitus.rei.data.source.repository.DataManagerImpl
import org.saudigitus.rei.ui.stages.StageViewModelFactory

@Module
class ProgramModule(private val view: ProgramView) {
Expand All @@ -40,12 +39,6 @@ class ProgramModule(private val view: ProgramView) {
)
}

@Provides
@PerFragment
internal fun stageViewModelFactory(dataManager: DataManager): StageViewModelFactory {
return StageViewModelFactory(dataManager)
}

@Provides
@PerFragment
internal fun homeRepository(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import org.hisp.dhis.android.core.program.Program
import org.hisp.dhis.android.core.program.ProgramType.WITHOUT_REGISTRATION
import org.hisp.dhis.android.core.program.ProgramType.WITH_REGISTRATION
import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor
import org.saudigitus.rei.utils.Utils.isRei

internal class ProgramRepositoryImpl(
private val d2: D2,
Expand Down Expand Up @@ -115,6 +116,7 @@ internal class ProgramRepositoryImpl(
} else {
null
},
isRei = isRei(d2, program.uid()),
)
}.toList().toFlowable().blockingFirst()
}
Expand Down
27 changes: 2 additions & 25 deletions app/src/main/java/org/dhis2/usescases/main/program/ProgramUi.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,12 @@ import androidx.compose.foundation.layout.Arrangement.Absolute.spacedBy
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.Card
import androidx.compose.material.CircularProgressIndicator
import androidx.compose.material.Icon
Expand Down Expand Up @@ -51,13 +48,10 @@ import androidx.compose.ui.semantics.SemanticsPropertyReceiver
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.text.font.Font
import androidx.compose.ui.text.font.FontFamily
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.IntSize
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.saudigitus.support_module.ui.MenuScreen
import org.dhis2.R
import org.dhis2.commons.bindings.addIf
import org.dhis2.commons.date.toDateSpan
Expand Down Expand Up @@ -89,8 +83,6 @@ import org.hisp.dhis.mobile.ui.designsystem.component.state.rememberListCardStat
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.saudigitus.rei.ui.stages.StageScreen
import org.saudigitus.rei.ui.stages.StageViewModel
import java.util.Date

enum class ProgramLayout {
Expand All @@ -105,7 +97,6 @@ enum class ProgramLayout {

@Composable
fun ProgramList(
stageViewModel: StageViewModel? = null,
programs: List<ProgramUiModel>?,
onItemClick: (programUiModel: ProgramUiModel) -> Unit,
onGranularSyncClick: (programUiModel: ProgramUiModel) -> Unit,
Expand All @@ -114,7 +105,6 @@ fun ProgramList(
Column(
modifier = Modifier
.fillMaxSize()
.verticalScroll(rememberScrollState())
.testTag(HOME_ITEMS)
.semantics {
HasPrograms = programs?.isNotEmpty() ?: false
Expand All @@ -129,8 +119,7 @@ fun ProgramList(

ExpandableItemColumn(
modifier = Modifier
.fillMaxWidth()
.height(300.dp),
.fillMaxSize(),
itemList = programs,
) { program, verticalPadding, onSizeChanged ->

Expand All @@ -152,19 +141,6 @@ fun ProgramList(
?: run { {} },
)
}
if (stageViewModel != null) {
StageScreen(stageViewModel)
}
Spacer(modifier = Modifier.height(16.dp))

Text(
text = "Suporte ao utilizador",
modifier = Modifier.padding(horizontal = 16.dp),
fontSize = 16.sp,
fontWeight = FontWeight.Bold,
color = Color.Black.copy(.5f),
)
MenuScreen(context = LocalContext.current)
} ?: run {
Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
ProgressIndicator(type = ProgressIndicatorType.CIRCULAR_SMALL)
Expand Down Expand Up @@ -693,6 +669,7 @@ private fun testingProgramModel() = ProgramUiModel(
state = State.SYNCED,
downloadState = ProgramDownloadState.NONE,
stockConfig = null,
isRei = false,
lastUpdated = Date(),
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ data class ProgramUiModel(
val downloadState: ProgramDownloadState,
val downloadActive: Boolean = false,
val stockConfig: AppConfig?,
val isRei: Boolean,
val lastUpdated: Date,
) {
fun countDescription() = "%s %s".format(count, typeName)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ class ProgramViewModelMapper() {
state = State.valueOf(state.name),
downloadState = ProgramDownloadState.NONE,
stockConfig = null,
isRei = false,
lastUpdated = program.lastUpdated() ?: Date(),
)
}
Expand All @@ -58,6 +59,7 @@ class ProgramViewModelMapper() {
state = dataSetInstanceSummary.state(),
downloadState = ProgramDownloadState.NONE,
stockConfig = null,
isRei = false,
lastUpdated = dataSet.lastUpdated() ?: Date(),
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ class SearchTeiLiveAdapter(
var cardHeightDp by remember { mutableStateOf(0.dp) }

val card = cardMapper.map(

searchTEIModel = it,
onSyncIconClick = {
onSyncIconClick.invoke(it.selectedEnrollment.uid())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ class TEICardMapper(
actionButton = { ProvideSyncButton(searchTEIModel, onSyncIconClick) },
expandLabelText = resourceManager.getString(R.string.show_more),
shrinkLabelText = resourceManager.getString(R.string.show_less),
status = style.first,
status = context.getString(style.first),
onCardCLick = onCardClick,
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@ private fun testingProgramModel(downloadState: ProgramDownloadState) = ProgramUi
state = State.SYNCED,
downloadState = downloadState,
stockConfig = null,
isRei = false,
lastUpdated = Date(),
)

Expand Down
1 change: 1 addition & 0 deletions rei/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ kotlin {
dependencies {
implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar"))))
implementation(project(":commons"))
implementation(project(":support-module"))
implementation(libs.dagger.hilt.android)
implementation(libs.androidx.compose.lifecycle)
implementation(libs.androidx.hilt.navigation.compose)
Expand Down
4 changes: 3 additions & 1 deletion rei/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

<application>
<activity android:name=".ReiActivity"/>
</application>
</manifest>
62 changes: 62 additions & 0 deletions rei/src/main/java/org/saudigitus/rei/ReiActivity.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package org.saudigitus.rei

import android.os.Bundle
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.activity.viewModels
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material.Surface
import androidx.compose.material.Text
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.fragment.app.FragmentActivity
import com.saudigitus.support_module.ui.MenuScreen
import dagger.hilt.android.AndroidEntryPoint
import org.dhis2.commons.Constants
import org.dhis2.ui.theme.Dhis2Theme
import org.saudigitus.rei.ui.stages.StageScreen
import org.saudigitus.rei.ui.stages.StageViewModel

@AndroidEntryPoint
class ReiActivity : FragmentActivity() {

private val viewModel: StageViewModel by viewModels()

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()

setContent {
Dhis2Theme {
viewModel.setProgram(intent?.extras?.getString(Constants.PROGRAM_UID) ?: "")

Surface(modifier = Modifier.fillMaxSize()) {
Column(
modifier = Modifier.fillMaxSize(),
verticalArrangement = Arrangement.Top,
horizontalAlignment = Alignment.CenterHorizontally,
) {
StageScreen(viewModel)

Text(
text = "Suporte ao utilizador",
modifier = Modifier.padding(horizontal = 16.dp),
fontSize = 16.sp,
fontWeight = FontWeight.Bold,
color = Color.Black.copy(.5f),
)

MenuScreen(context = this@ReiActivity)
}
}
}
}
}
}
Loading

0 comments on commit 9adf8cd

Please sign in to comment.