Skip to content

Commit 3de02f3

Browse files
committed
Migrate DisplayViewHolderFactory to compose
1 parent f07682b commit 3de02f3

File tree

3 files changed

+64
-72
lines changed

3 files changed

+64
-72
lines changed
Lines changed: 40 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2023 Google LLC
2+
* Copyright 2025 Google LLC
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -14,31 +14,50 @@
1414
* limitations under the License.
1515
*/
1616

17-
package com.google.android.fhir.datacapture.views.factories
17+
package com.google.android.fhir.datacapture.test.views
1818

19-
import android.view.View
2019
import android.widget.FrameLayout
2120
import android.widget.TextView
21+
import androidx.compose.ui.test.assertIsNotDisplayed
22+
import androidx.compose.ui.test.junit4.createEmptyComposeRule
23+
import androidx.compose.ui.test.onNodeWithTag
24+
import androidx.test.ext.junit.rules.ActivityScenarioRule
25+
import androidx.test.ext.junit.runners.AndroidJUnit4
26+
import androidx.test.platform.app.InstrumentationRegistry
2227
import com.google.android.fhir.datacapture.R
28+
import com.google.android.fhir.datacapture.test.TestActivity
2329
import com.google.android.fhir.datacapture.validation.NotValidated
2430
import com.google.android.fhir.datacapture.views.QuestionnaireViewItem
31+
import com.google.android.fhir.datacapture.views.compose.ERROR_TEXT_AT_HEADER_TEST_TAG
32+
import com.google.android.fhir.datacapture.views.factories.DisplayViewHolderFactory
33+
import com.google.android.fhir.datacapture.views.factories.QuestionnaireItemViewHolder
2534
import com.google.common.truth.Truth.assertThat
2635
import org.hl7.fhir.r4.model.Questionnaire
2736
import org.hl7.fhir.r4.model.QuestionnaireResponse
37+
import org.junit.Before
38+
import org.junit.Rule
2839
import org.junit.Test
2940
import org.junit.runner.RunWith
30-
import org.robolectric.RobolectricTestRunner
31-
import org.robolectric.RuntimeEnvironment
3241

33-
@RunWith(RobolectricTestRunner::class)
42+
@RunWith(AndroidJUnit4::class)
3443
class DisplayViewHolderFactoryTest {
35-
private val parent =
36-
FrameLayout(
37-
RuntimeEnvironment.getApplication().apply {
38-
setTheme(com.google.android.material.R.style.Theme_Material3_DayNight)
39-
},
40-
)
41-
private val viewHolder = DisplayViewHolderFactory.create(parent)
44+
@get:Rule
45+
val activityScenarioRule: ActivityScenarioRule<TestActivity> =
46+
ActivityScenarioRule(TestActivity::class.java)
47+
48+
@get:Rule val composeTestRule = createEmptyComposeRule()
49+
50+
private lateinit var viewHolder: QuestionnaireItemViewHolder
51+
52+
@Before
53+
fun setUp() {
54+
activityScenarioRule.scenario.onActivity { activity ->
55+
viewHolder = DisplayViewHolderFactory.create(FrameLayout(activity))
56+
activity.setContentView(viewHolder.itemView)
57+
}
58+
59+
InstrumentationRegistry.getInstrumentation().waitForIdleSync()
60+
}
4261

4362
@Test
4463
fun shouldSetQuestionHeader() {
@@ -51,12 +70,15 @@ class DisplayViewHolderFactoryTest {
5170
),
5271
)
5372

73+
// Synchronize
74+
composeTestRule.waitForIdle()
75+
5476
assertThat(viewHolder.itemView.findViewById<TextView>(R.id.question).text.toString())
5577
.isEqualTo("Display")
5678
}
5779

5880
@Test
59-
fun `hides error textview in the header`() {
81+
fun hidesErrorTextviewInTheHeader() {
6082
viewHolder.bind(
6183
QuestionnaireViewItem(
6284
Questionnaire.QuestionnaireItemComponent(),
@@ -65,8 +87,9 @@ class DisplayViewHolderFactoryTest {
6587
answersChangedCallback = { _, _, _, _ -> },
6688
),
6789
)
68-
69-
assertThat(viewHolder.itemView.findViewById<TextView>(R.id.error_text_at_header).visibility)
70-
.isEqualTo(View.GONE)
90+
composeTestRule
91+
.onNodeWithTag(ERROR_TEXT_AT_HEADER_TEST_TAG)
92+
.assertIsNotDisplayed()
93+
.assertDoesNotExist()
7194
}
7295
}

datacapture/src/main/java/com/google/android/fhir/datacapture/views/factories/DisplayViewHolderFactory.kt

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,28 +16,35 @@
1616

1717
package com.google.android.fhir.datacapture.views.factories
1818

19-
import android.view.View
19+
import androidx.compose.foundation.layout.Column
20+
import androidx.compose.foundation.layout.fillMaxWidth
21+
import androidx.compose.foundation.layout.padding
22+
import androidx.compose.runtime.Composable
23+
import androidx.compose.ui.Modifier
24+
import androidx.compose.ui.res.dimensionResource
2025
import com.google.android.fhir.datacapture.R
21-
import com.google.android.fhir.datacapture.views.HeaderView
26+
import com.google.android.fhir.datacapture.extensions.itemMedia
2227
import com.google.android.fhir.datacapture.views.QuestionnaireViewItem
28+
import com.google.android.fhir.datacapture.views.compose.Header
29+
import com.google.android.fhir.datacapture.views.compose.MediaItem
2330

24-
internal object DisplayViewHolderFactory :
25-
QuestionnaireItemAndroidViewHolderFactory(R.layout.display_view) {
31+
internal object DisplayViewHolderFactory : QuestionnaireItemComposeViewHolderFactory {
2632
override fun getQuestionnaireItemViewHolderDelegate() =
27-
object : QuestionnaireItemAndroidViewHolderDelegate {
28-
private lateinit var header: HeaderView
29-
override lateinit var questionnaireViewItem: QuestionnaireViewItem
33+
object : QuestionnaireItemComposeViewHolderDelegate {
3034

31-
override fun init(itemView: View) {
32-
header = itemView.findViewById(R.id.header)
33-
}
34-
35-
override fun bind(questionnaireViewItem: QuestionnaireViewItem) {
36-
header.bind(questionnaireViewItem)
37-
}
38-
39-
override fun setReadOnly(isReadOnly: Boolean) {
40-
// Display type questions have no user input
35+
@Composable
36+
override fun Content(questionnaireViewItem: QuestionnaireViewItem) {
37+
Column(
38+
modifier =
39+
Modifier.fillMaxWidth()
40+
.padding(
41+
horizontal = dimensionResource(R.dimen.item_margin_horizontal),
42+
vertical = dimensionResource(R.dimen.item_margin_vertical),
43+
),
44+
) {
45+
Header(questionnaireViewItem)
46+
questionnaireViewItem.questionnaireItem.itemMedia?.let { MediaItem(it) }
47+
}
4148
}
4249
}
4350
}

datacapture/src/main/res/layout/display_view.xml

Lines changed: 0 additions & 38 deletions
This file was deleted.

0 commit comments

Comments
 (0)