Skip to content

Commit 2fe7a38

Browse files
authored
Fix task unticking (#65)
* move questionnaire launch to Activity result contracts * disable patient while loading data * Update build.gradle.kts
1 parent 8931ccb commit 2fe7a38

File tree

4 files changed

+217
-115
lines changed

4 files changed

+217
-115
lines changed

android/engine/src/main/java/org/smartregister/fhircore/engine/ui/questionnaire/QuestionnaireActivity.kt

+68-24
Original file line numberDiff line numberDiff line change
@@ -576,18 +576,16 @@ open class QuestionnaireActivity : BaseMultiLanguageActivity(), View.OnClickList
576576
populationResources: ArrayList<Resource>? = null,
577577
) {
578578
context.startActivity(
579-
Intent(context, QuestionnaireActivity::class.java)
580-
.putExtras(intentBundle)
581-
.putExtras(
582-
intentArgs(
583-
clientIdentifier = clientIdentifier,
584-
groupIdentifier = groupIdentifier,
585-
formName = questionnaireId,
586-
questionnaireType = questionnaireType,
587-
launchContexts = launchContexts,
588-
populationResources = populationResources ?: ArrayList(),
589-
),
590-
),
579+
createQuestionnaireIntent(
580+
context = context,
581+
questionnaireId = questionnaireId,
582+
clientIdentifier = clientIdentifier,
583+
groupIdentifier = groupIdentifier,
584+
questionnaireType = questionnaireType,
585+
intentBundle = intentBundle,
586+
launchContexts = launchContexts,
587+
populationResources = populationResources,
588+
),
591589
)
592590
}
593591

@@ -602,20 +600,66 @@ open class QuestionnaireActivity : BaseMultiLanguageActivity(), View.OnClickList
602600
populationResources: ArrayList<Resource>? = null,
603601
) {
604602
context.startActivityForResult(
605-
Intent(context, QuestionnaireActivity::class.java)
606-
.putExtras(intentBundle)
607-
.putExtras(
608-
intentArgs(
609-
clientIdentifier = clientIdentifier,
610-
formName = questionnaireId,
611-
questionnaireType = questionnaireType,
612-
backReference = backReference,
613-
launchContexts = launchContexts,
614-
populationResources = populationResources ?: ArrayList(),
615-
),
616-
),
603+
createQuestionnaireResultIntent(
604+
context = context,
605+
questionnaireId = questionnaireId,
606+
clientIdentifier = clientIdentifier,
607+
questionnaireType = questionnaireType,
608+
backReference = backReference,
609+
intentBundle = intentBundle,
610+
launchContexts = launchContexts,
611+
populationResources = populationResources,
612+
),
617613
0,
618614
)
619615
}
616+
617+
fun createQuestionnaireResultIntent(
618+
context: Activity,
619+
questionnaireId: String,
620+
clientIdentifier: String? = null,
621+
questionnaireType: QuestionnaireType = QuestionnaireType.DEFAULT,
622+
backReference: String? = null,
623+
intentBundle: Bundle = Bundle.EMPTY,
624+
launchContexts: Map<String, Resource> = emptyMap(),
625+
populationResources: ArrayList<Resource>? = null,
626+
): Intent {
627+
return Intent(context, QuestionnaireActivity::class.java)
628+
.putExtras(intentBundle)
629+
.putExtras(
630+
intentArgs(
631+
clientIdentifier = clientIdentifier,
632+
formName = questionnaireId,
633+
questionnaireType = questionnaireType,
634+
backReference = backReference,
635+
launchContexts = launchContexts,
636+
populationResources = populationResources ?: ArrayList(),
637+
),
638+
)
639+
}
640+
641+
fun createQuestionnaireIntent(
642+
context: Context,
643+
questionnaireId: String,
644+
clientIdentifier: String? = null,
645+
groupIdentifier: String? = null,
646+
questionnaireType: QuestionnaireType = QuestionnaireType.DEFAULT,
647+
intentBundle: Bundle = Bundle.EMPTY,
648+
launchContexts: Map<String, Resource> = emptyMap(),
649+
populationResources: ArrayList<Resource>? = null,
650+
): Intent {
651+
return Intent(context, QuestionnaireActivity::class.java)
652+
.putExtras(intentBundle)
653+
.putExtras(
654+
intentArgs(
655+
clientIdentifier = clientIdentifier,
656+
groupIdentifier = groupIdentifier,
657+
formName = questionnaireId,
658+
questionnaireType = questionnaireType,
659+
launchContexts = launchContexts,
660+
populationResources = populationResources ?: ArrayList(),
661+
),
662+
)
663+
}
620664
}
621665
}

android/quest/build.gradle.kts

+4-4
Original file line numberDiff line numberDiff line change
@@ -141,15 +141,15 @@ android {
141141
dimension = "apps"
142142
applicationIdSuffix = ".mwcoreDev"
143143
versionNameSuffix = "-mwcoreDev"
144-
versionCode = 35
145-
versionName = "0.1.24"
144+
versionCode = 36
145+
versionName = "0.1.25"
146146
}
147147
create("mwcoreStaging") {
148148
dimension = "apps"
149149
applicationIdSuffix = ".mwcoreStaging"
150150
versionNameSuffix = "-mwcoreStaging"
151-
versionCode = 2
152-
versionName = "0.0.2"
151+
versionCode = 3
152+
versionName = "0.0.3"
153153
}
154154
}
155155

android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/PatientProfileScreen.kt

+99-73
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616

1717
package org.smartregister.fhircore.quest.ui.patient.profile
1818

19+
import android.app.Activity
20+
import androidx.activity.compose.rememberLauncherForActivityResult
21+
import androidx.activity.result.contract.ActivityResultContracts
1922
import androidx.compose.foundation.background
2023
import androidx.compose.foundation.layout.Arrangement
2124
import androidx.compose.foundation.layout.Box
@@ -32,6 +35,7 @@ import androidx.compose.material.DropdownMenu
3235
import androidx.compose.material.DropdownMenuItem
3336
import androidx.compose.material.Icon
3437
import androidx.compose.material.IconButton
38+
import androidx.compose.material.LinearProgressIndicator
3539
import androidx.compose.material.Scaffold
3640
import androidx.compose.material.Text
3741
import androidx.compose.material.TopAppBar
@@ -60,6 +64,7 @@ import androidx.hilt.navigation.compose.hiltViewModel
6064
import androidx.navigation.NavHostController
6165
import java.util.Locale
6266
import org.smartregister.fhircore.engine.R
67+
import org.smartregister.fhircore.engine.domain.util.DataLoadState
6368
import org.smartregister.fhircore.engine.ui.components.FormButton
6469
import org.smartregister.fhircore.engine.ui.theme.PatientProfileSectionsBackgroundColor
6570
import org.smartregister.fhircore.engine.ui.theme.WelcomeServiceBackToCareColor
@@ -88,81 +93,99 @@ fun PatientProfileScreen(
8893
val taskId by appMainViewModel.completedTaskId.collectAsState()
8994
val syncing by remember { patientProfileViewModel.isSyncing }
9095
val tasksId = profileViewData.tasks.map { it.actionFormId }
96+
val loadingState by patientProfileViewModel.loadingState.collectAsState()
9197

92-
LaunchedEffect(taskId) {
93-
taskId?.let { patientProfileViewModel.fetchPatientProfileDataWithChildren() }
94-
}
98+
val launchQuestionnaireActivityForResults =
99+
rememberLauncherForActivityResult(
100+
contract = ActivityResultContracts.StartActivityForResult(),
101+
onResult = {
102+
if (it.resultCode == Activity.RESULT_OK && it.data != null) {
103+
patientProfileViewModel.reFetch()
104+
}
105+
},
106+
)
107+
108+
LaunchedEffect(taskId) { taskId?.let { patientProfileViewModel.reFetch() } }
95109

96110
Scaffold(
97111
topBar = {
98-
TopAppBar(
99-
title = { Text(stringResource(R.string.profile)) },
100-
navigationIcon = {
101-
IconButton(onClick = { navController.popBackStack() }) {
102-
Icon(Icons.Filled.ArrowBack, null)
103-
}
104-
},
105-
actions = {
106-
IconButton(onClick = { patientProfileViewModel.reSync() }, enabled = !syncing) {
107-
Icon(
108-
imageVector = Icons.Outlined.Refresh,
109-
contentDescription = null,
110-
tint = Color.White,
111-
)
112-
}
113-
IconButton(onClick = { showOverflowMenu = !showOverflowMenu }) {
114-
Icon(
115-
imageVector = Icons.Outlined.MoreVert,
116-
contentDescription = null,
117-
tint = Color.White,
118-
)
119-
}
120-
DropdownMenu(
121-
expanded = showOverflowMenu,
122-
onDismissRequest = { showOverflowMenu = false },
123-
) {
124-
viewState.visibleOverflowMenuItems().forEach {
125-
DropdownMenuItem(
126-
onClick = {
127-
showOverflowMenu = false
128-
patientProfileViewModel.onEvent(
129-
PatientProfileEvent.OverflowMenuClick(navController, context, it.id),
130-
)
131-
},
132-
contentPadding = PaddingValues(horizontal = 16.dp, vertical = 8.dp),
133-
modifier =
134-
modifier
135-
.fillMaxWidth()
136-
.background(
137-
color =
138-
if (it.confirmAction) {
139-
it.titleColor.copy(alpha = 0.1f)
140-
} else Color.Transparent,
141-
),
142-
) {
143-
when (it.id) {
144-
R2.id.view_children -> {
145-
Text(text = profileViewData.viewChildText, color = it.titleColor)
146-
}
147-
R2.id.view_guardians -> {
148-
Text(
149-
text = stringResource(it.titleResource, profileViewData.guardians.size),
150-
color = it.titleColor,
112+
Column(Modifier.fillMaxWidth()) {
113+
TopAppBar(
114+
title = { Text(stringResource(R.string.profile)) },
115+
navigationIcon = {
116+
IconButton(onClick = { navController.popBackStack() }) {
117+
Icon(Icons.Filled.ArrowBack, null)
118+
}
119+
},
120+
actions = {
121+
IconButton(onClick = { patientProfileViewModel.reFetch() }, enabled = !syncing) {
122+
Icon(
123+
imageVector = Icons.Outlined.Refresh,
124+
contentDescription = null,
125+
tint = Color.White,
126+
)
127+
}
128+
IconButton(onClick = { showOverflowMenu = !showOverflowMenu }) {
129+
Icon(
130+
imageVector = Icons.Outlined.MoreVert,
131+
contentDescription = null,
132+
tint = Color.White,
133+
)
134+
}
135+
DropdownMenu(
136+
expanded = showOverflowMenu,
137+
onDismissRequest = { showOverflowMenu = false },
138+
) {
139+
viewState.visibleOverflowMenuItems().forEach {
140+
DropdownMenuItem(
141+
onClick = {
142+
showOverflowMenu = false
143+
patientProfileViewModel.onEvent(
144+
PatientProfileEvent.OverflowMenuClick(navController, context, it.id),
151145
)
152-
}
153-
else -> {
154-
Text(text = stringResource(id = it.titleResource), color = it.titleColor)
146+
},
147+
contentPadding = PaddingValues(horizontal = 16.dp, vertical = 8.dp),
148+
modifier =
149+
modifier
150+
.fillMaxWidth()
151+
.background(
152+
color =
153+
if (it.confirmAction) {
154+
it.titleColor.copy(alpha = 0.1f)
155+
} else Color.Transparent,
156+
),
157+
) {
158+
when (it.id) {
159+
R2.id.view_children -> {
160+
Text(text = profileViewData.viewChildText, color = it.titleColor)
161+
}
162+
R2.id.view_guardians -> {
163+
Text(
164+
text = stringResource(it.titleResource, profileViewData.guardians.size),
165+
color = it.titleColor,
166+
)
167+
}
168+
else -> {
169+
Text(text = stringResource(id = it.titleResource), color = it.titleColor)
170+
}
155171
}
156172
}
157173
}
158174
}
159-
}
160-
},
161-
)
175+
},
176+
)
177+
if (loadingState is DataLoadState.Loading) {
178+
LinearProgressIndicator(modifier = Modifier.fillMaxWidth())
179+
}
180+
}
162181
},
163182
) { innerPadding ->
164-
Column(modifier = modifier.fillMaxHeight().fillMaxWidth()) {
165-
Box(modifier = Modifier.padding(innerPadding).weight(2.0f)) {
183+
Column(
184+
modifier = modifier.fillMaxHeight().fillMaxWidth(),
185+
) {
186+
Box(
187+
modifier = Modifier.padding(innerPadding).weight(2.0f),
188+
) {
166189
Column(
167190
modifier =
168191
modifier
@@ -202,10 +225,10 @@ fun PatientProfileScreen(
202225
) {
203226
profileViewData.tasks.forEach {
204227
ProfileActionableItem(
205-
it,
228+
if (loadingState is DataLoadState.Loading) it.copy(actionFormId = null) else it,
206229
onActionClick = { taskFormId, taskId ->
207-
patientProfileViewModel.onEvent(
208-
PatientProfileEvent.OpenTaskForm(
230+
launchQuestionnaireActivityForResults.launch(
231+
patientProfileViewModel.createLaunchTaskIntent(
209232
context = context,
210233
taskFormId = taskFormId,
211234
taskId = taskId,
@@ -228,8 +251,11 @@ fun PatientProfileScreen(
228251
FormButton(
229252
formButtonData = it,
230253
onFormClick = { questionnaireId, _ ->
231-
patientProfileViewModel.onEvent(
232-
PatientProfileEvent.LoadQuestionnaire(questionnaireId, context),
254+
launchQuestionnaireActivityForResults.launch(
255+
patientProfileViewModel.createLaunchQuestionnaireIntent(
256+
context = context,
257+
questionnaireId = questionnaireId,
258+
),
233259
)
234260
},
235261
)
@@ -285,14 +311,14 @@ fun PatientProfileScreen(
285311
modifier = Modifier.fillMaxWidth().padding(0.dp),
286312
shape = RectangleShape,
287313
onClick = {
288-
patientProfileViewModel.onEvent(
289-
PatientProfileEvent.FinishVisit(
314+
launchQuestionnaireActivityForResults.launch(
315+
patientProfileViewModel.createLaunchTaskIntent(
290316
context = context,
291-
formId = PatientProfileViewModel.PATIENT_FINISH_VISIT,
317+
taskFormId = PatientProfileViewModel.PATIENT_FINISH_VISIT,
292318
),
293319
)
294320
},
295-
enabled = profileViewData.tasksCompleted,
321+
enabled = profileViewData.tasksCompleted && loadingState !is DataLoadState.Loading,
296322
) {
297323
Text(
298324
modifier = Modifier.padding(10.dp),

0 commit comments

Comments
 (0)