@@ -21,9 +21,17 @@ import android.os.Bundle
2121import android.view.LayoutInflater
2222import android.view.View
2323import android.view.ViewGroup
24+ import android.widget.LinearLayout
2425import android.widget.TextView
2526import androidx.annotation.VisibleForTesting
2627import androidx.appcompat.view.ContextThemeWrapper
28+ import androidx.compose.foundation.layout.fillMaxWidth
29+ import androidx.compose.foundation.lazy.LazyColumn
30+ import androidx.compose.foundation.lazy.items
31+ import androidx.compose.runtime.Composable
32+ import androidx.compose.ui.Modifier
33+ import androidx.compose.ui.platform.ComposeView
34+ import androidx.compose.ui.viewinterop.AndroidView
2735import androidx.core.content.res.use
2836import androidx.core.os.bundleOf
2937import androidx.fragment.app.Fragment
@@ -33,9 +41,11 @@ import androidx.fragment.app.viewModels
3341import androidx.lifecycle.lifecycleScope
3442import androidx.recyclerview.widget.LinearLayoutManager
3543import androidx.recyclerview.widget.RecyclerView
44+ import com.google.android.fhir.datacapture.extensions.inflate
3645import com.google.android.fhir.datacapture.validation.Invalid
3746import com.google.android.fhir.datacapture.views.NavigationViewHolder
3847import com.google.android.fhir.datacapture.views.factories.QuestionnaireItemViewHolderFactory
48+ import com.google.android.fhir.datacapture.views.factories.ReviewViewHolderFactory
3949import com.google.android.material.progressindicator.LinearProgressIndicator
4050import kotlinx.coroutines.launch
4151import org.hl7.fhir.r4.model.Questionnaire
@@ -93,8 +103,8 @@ class QuestionnaireFragment : Fragment() {
93103 override fun onViewCreated (view : View , savedInstanceState : Bundle ? ) {
94104 val questionnaireEditRecyclerView =
95105 view.findViewById<RecyclerView >(R .id.questionnaire_edit_recycler_view)
96- val questionnaireReviewRecyclerView =
97- view.findViewById<RecyclerView >(R .id.questionnaire_review_recycler_view)
106+ val questionnaireReviewComposeView =
107+ view.findViewById<ComposeView >(R .id.questionnaire_review_recycler_view)
98108 val questionnaireTitle = view.findViewById<TextView >(R .id.questionnaire_title)
99109
100110 // This container frame floats at the bottom of the view to make navigation controls visible at
@@ -139,7 +149,6 @@ class QuestionnaireFragment : Fragment() {
139149 view.findViewById(R .id.questionnaire_progress_indicator)
140150 val questionnaireEditAdapter =
141151 QuestionnaireEditAdapter (questionnaireItemViewHolderFactoryMatchersProvider.get())
142- val questionnaireReviewAdapter = QuestionnaireReviewAdapter ()
143152
144153 val reviewModeEditButton =
145154 view.findViewById<View >(R .id.review_mode_edit_button).apply {
@@ -152,20 +161,16 @@ class QuestionnaireFragment : Fragment() {
152161 // Animation does work well with views that could gain focus
153162 questionnaireEditRecyclerView.itemAnimator = null
154163
155- questionnaireReviewRecyclerView.adapter = questionnaireReviewAdapter
156- questionnaireReviewRecyclerView.layoutManager = LinearLayoutManager (view.context)
157-
158164 // Listen to updates from the view model.
159165 viewLifecycleOwner.lifecycleScope.launchWhenCreated {
160166 viewModel.questionnaireStateFlow.collect { state ->
161167 when (val displayMode = state.displayMode) {
162168 is DisplayMode .ReviewMode -> {
163169 // Set items
164170 questionnaireEditRecyclerView.visibility = View .GONE
165- questionnaireReviewAdapter.submitList(
166- state.items.filterIsInstance<ReviewAdapterItem >(),
167- )
168- questionnaireReviewRecyclerView.visibility = View .VISIBLE
171+
172+ questionnaireReviewComposeView.visibility = View .VISIBLE
173+ questionnaireReviewComposeView.setContent { QuestionnaireReviewList (state.items) }
169174 reviewModeEditButton.visibility =
170175 if (displayMode.showEditButton) {
171176 View .VISIBLE
@@ -189,7 +194,7 @@ class QuestionnaireFragment : Fragment() {
189194 }
190195 is DisplayMode .EditMode -> {
191196 // Set items
192- questionnaireReviewRecyclerView .visibility = View .GONE
197+ questionnaireReviewComposeView .visibility = View .GONE
193198 questionnaireEditAdapter.submitList(state.items)
194199 questionnaireEditRecyclerView.visibility = View .VISIBLE
195200 reviewModeEditButton.visibility = View .GONE
@@ -234,7 +239,7 @@ class QuestionnaireFragment : Fragment() {
234239 }
235240 }
236241 is DisplayMode .InitMode -> {
237- questionnaireReviewRecyclerView .visibility = View .GONE
242+ questionnaireReviewComposeView .visibility = View .GONE
238243 questionnaireEditRecyclerView.visibility = View .GONE
239244 questionnaireProgressIndicator.visibility = View .GONE
240245 reviewModeEditButton.visibility = View .GONE
@@ -283,6 +288,53 @@ class QuestionnaireFragment : Fragment() {
283288 }
284289 }
285290
291+ @Composable
292+ private fun QuestionnaireReviewList (items : List <QuestionnaireAdapterItem >) {
293+ LazyColumn {
294+ items(
295+ items = items,
296+ key = { item ->
297+ when (item) {
298+ is QuestionnaireAdapterItem .Question -> item.id
299+ ? : throw IllegalStateException (" Missing id for the Question: $item " )
300+ is QuestionnaireAdapterItem .RepeatedGroupHeader -> item.id
301+ is QuestionnaireAdapterItem .Navigation -> " navigation"
302+ is QuestionnaireAdapterItem .RepeatedGroupAddButton -> item.id
303+ ? : throw IllegalStateException (" Missing id for the RepeatedGroupAddButton: $item " )
304+ }
305+ },
306+ ) { item: QuestionnaireAdapterItem ->
307+ AndroidView (
308+ factory = { context ->
309+ LinearLayout (context).apply {
310+ orientation = LinearLayout .VERTICAL
311+ when (item) {
312+ is QuestionnaireAdapterItem .Question -> {
313+ val viewHolder = ReviewViewHolderFactory .create(this )
314+ viewHolder.bind(item.item)
315+ addView(viewHolder.itemView)
316+ }
317+ is QuestionnaireAdapterItem .Navigation -> {
318+ val viewHolder =
319+ NavigationViewHolder (inflate(R .layout.pagination_navigation_view))
320+ viewHolder.bind(item.questionnaireNavigationUIState)
321+ addView(viewHolder.itemView)
322+ }
323+ is QuestionnaireAdapterItem .RepeatedGroupHeader -> {
324+ TODO (" Not implemented yet" )
325+ }
326+ is QuestionnaireAdapterItem .RepeatedGroupAddButton -> {
327+ TODO (" Not implemented yet" )
328+ }
329+ }
330+ }
331+ },
332+ modifier = Modifier .fillMaxWidth(),
333+ )
334+ }
335+ }
336+ }
337+
286338 /* * Calculates the progress percentage from given [count] and [totalCount] values. */
287339 internal fun calculateProgressPercentage (count : Int , totalCount : Int ): Int {
288340 return if (totalCount == 0 ) 0 else (count * 100 / totalCount)
0 commit comments