diff --git a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/factories/DisplayViewHolderFactoryTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/test/views/DisplayViewHolderFactoryTest.kt similarity index 53% rename from datacapture/src/test/java/com/google/android/fhir/datacapture/views/factories/DisplayViewHolderFactoryTest.kt rename to datacapture/src/androidTest/java/com/google/android/fhir/datacapture/test/views/DisplayViewHolderFactoryTest.kt index 4a1e7c1ac3..6f998969d1 100644 --- a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/factories/DisplayViewHolderFactoryTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/test/views/DisplayViewHolderFactoryTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2023 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,31 +14,50 @@ * limitations under the License. */ -package com.google.android.fhir.datacapture.views.factories +package com.google.android.fhir.datacapture.test.views -import android.view.View import android.widget.FrameLayout import android.widget.TextView +import androidx.compose.ui.test.assertIsNotDisplayed +import androidx.compose.ui.test.junit4.createEmptyComposeRule +import androidx.compose.ui.test.onNodeWithTag +import androidx.test.ext.junit.rules.ActivityScenarioRule +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry import com.google.android.fhir.datacapture.R +import com.google.android.fhir.datacapture.test.TestActivity import com.google.android.fhir.datacapture.validation.NotValidated import com.google.android.fhir.datacapture.views.QuestionnaireViewItem +import com.google.android.fhir.datacapture.views.compose.ERROR_TEXT_AT_HEADER_TEST_TAG +import com.google.android.fhir.datacapture.views.factories.DisplayViewHolderFactory +import com.google.android.fhir.datacapture.views.factories.QuestionnaireItemViewHolder import com.google.common.truth.Truth.assertThat import org.hl7.fhir.r4.model.Questionnaire import org.hl7.fhir.r4.model.QuestionnaireResponse +import org.junit.Before +import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith -import org.robolectric.RobolectricTestRunner -import org.robolectric.RuntimeEnvironment -@RunWith(RobolectricTestRunner::class) +@RunWith(AndroidJUnit4::class) class DisplayViewHolderFactoryTest { - private val parent = - FrameLayout( - RuntimeEnvironment.getApplication().apply { - setTheme(com.google.android.material.R.style.Theme_Material3_DayNight) - }, - ) - private val viewHolder = DisplayViewHolderFactory.create(parent) + @get:Rule + val activityScenarioRule: ActivityScenarioRule = + ActivityScenarioRule(TestActivity::class.java) + + @get:Rule val composeTestRule = createEmptyComposeRule() + + private lateinit var viewHolder: QuestionnaireItemViewHolder + + @Before + fun setUp() { + activityScenarioRule.scenario.onActivity { activity -> + viewHolder = DisplayViewHolderFactory.create(FrameLayout(activity)) + activity.setContentView(viewHolder.itemView) + } + + InstrumentationRegistry.getInstrumentation().waitForIdleSync() + } @Test fun shouldSetQuestionHeader() { @@ -51,12 +70,15 @@ class DisplayViewHolderFactoryTest { ), ) + // Synchronize + composeTestRule.waitForIdle() + assertThat(viewHolder.itemView.findViewById(R.id.question).text.toString()) .isEqualTo("Display") } @Test - fun `hides error textview in the header`() { + fun hidesErrorTextviewInTheHeader() { viewHolder.bind( QuestionnaireViewItem( Questionnaire.QuestionnaireItemComponent(), @@ -65,8 +87,9 @@ class DisplayViewHolderFactoryTest { answersChangedCallback = { _, _, _, _ -> }, ), ) - - assertThat(viewHolder.itemView.findViewById(R.id.error_text_at_header).visibility) - .isEqualTo(View.GONE) + composeTestRule + .onNodeWithTag(ERROR_TEXT_AT_HEADER_TEST_TAG) + .assertIsNotDisplayed() + .assertDoesNotExist() } } diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/factories/DisplayViewHolderFactory.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/factories/DisplayViewHolderFactory.kt index 47610a6cee..8735d2e10a 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/factories/DisplayViewHolderFactory.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/factories/DisplayViewHolderFactory.kt @@ -16,28 +16,35 @@ package com.google.android.fhir.datacapture.views.factories -import android.view.View +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.dimensionResource import com.google.android.fhir.datacapture.R -import com.google.android.fhir.datacapture.views.HeaderView +import com.google.android.fhir.datacapture.extensions.itemMedia import com.google.android.fhir.datacapture.views.QuestionnaireViewItem +import com.google.android.fhir.datacapture.views.compose.Header +import com.google.android.fhir.datacapture.views.compose.MediaItem -internal object DisplayViewHolderFactory : - QuestionnaireItemAndroidViewHolderFactory(R.layout.display_view) { +internal object DisplayViewHolderFactory : QuestionnaireItemComposeViewHolderFactory { override fun getQuestionnaireItemViewHolderDelegate() = - object : QuestionnaireItemAndroidViewHolderDelegate { - private lateinit var header: HeaderView - override lateinit var questionnaireViewItem: QuestionnaireViewItem + object : QuestionnaireItemComposeViewHolderDelegate { - override fun init(itemView: View) { - header = itemView.findViewById(R.id.header) - } - - override fun bind(questionnaireViewItem: QuestionnaireViewItem) { - header.bind(questionnaireViewItem) - } - - override fun setReadOnly(isReadOnly: Boolean) { - // Display type questions have no user input + @Composable + override fun Content(questionnaireViewItem: QuestionnaireViewItem) { + Column( + modifier = + Modifier.fillMaxWidth() + .padding( + horizontal = dimensionResource(R.dimen.item_margin_horizontal), + vertical = dimensionResource(R.dimen.item_margin_vertical), + ), + ) { + Header(questionnaireViewItem) + questionnaireViewItem.questionnaireItem.itemMedia?.let { MediaItem(it) } + } } } } diff --git a/datacapture/src/main/res/layout/display_view.xml b/datacapture/src/main/res/layout/display_view.xml deleted file mode 100644 index 6529da065b..0000000000 --- a/datacapture/src/main/res/layout/display_view.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - -