Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Localized date rendering #1013

Merged
merged 9 commits into from
Feb 3, 2022
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,11 @@ import androidx.test.platform.app.InstrumentationRegistry
import com.google.android.fhir.datacapture.R
import com.google.android.material.textfield.TextInputLayout
import com.google.common.truth.Truth.assertThat
import java.util.Locale
import org.hl7.fhir.r4.model.DateType
import org.hl7.fhir.r4.model.Questionnaire
import org.hl7.fhir.r4.model.QuestionnaireResponse
import org.junit.After
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
Expand All @@ -50,6 +52,11 @@ class QuestionnaireItemDatePickerViewHolderFactoryInstrumentedTest {
viewHolder = QuestionnaireItemDatePickerViewHolderFactory.create(parent)
}

@After
fun tearDown() {
setLocale(Locale.US)
}

vvikramraj marked this conversation as resolved.
Show resolved Hide resolved
@Test
fun shouldShowPrefixText() {
viewHolder.bind(
Expand Down Expand Up @@ -108,22 +115,62 @@ class QuestionnaireItemDatePickerViewHolderFactoryInstrumentedTest {

@Test
@UiThreadTest
fun shouldSetDateInput() {
fun shouldSetDateInput_localeUs() {
setLocale(Locale.US)
viewHolder.bind(
QuestionnaireItemViewItem(
Questionnaire.QuestionnaireItemComponent().apply { text = "Question?" },
QuestionnaireResponse.QuestionnaireResponseItemComponent()
.addAnswer(
QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent()
.setValue(DateType(2020, 0, 1))
.setValue(DateType(2020, 10, 19))
)
) {}
)
assertThat(
viewHolder.itemView.findViewById<TextView>(R.id.text_input_edit_text).text.toString()
)
.isEqualTo("Nov 19, 2020")
}

@Test
@UiThreadTest
fun shouldSetDateInput_localeJp() {
setLocale(Locale.JAPAN)
viewHolder.bind(
QuestionnaireItemViewItem(
Questionnaire.QuestionnaireItemComponent().apply { text = "Question?" },
QuestionnaireResponse.QuestionnaireResponseItemComponent()
.addAnswer(
QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent()
.setValue(DateType(2020, 10, 19))
)
) {}
)
assertThat(
viewHolder.itemView.findViewById<TextView>(R.id.text_input_edit_text).text.toString()
)
.isEqualTo("2020-01-01")
.isEqualTo("2020/11/19")
}

@Test
@UiThreadTest
fun shouldSetDateInput_localeEn() {
setLocale(Locale.ENGLISH)
viewHolder.bind(
QuestionnaireItemViewItem(
Questionnaire.QuestionnaireItemComponent().apply { text = "Question?" },
QuestionnaireResponse.QuestionnaireResponseItemComponent()
.addAnswer(
QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent()
.setValue(DateType(2020, 10, 19))
)
) {}
)
assertThat(
viewHolder.itemView.findViewById<TextView>(R.id.text_input_edit_text).text.toString()
)
.isEqualTo("Nov 19, 2020")
}

@Test
Expand Down Expand Up @@ -196,4 +243,9 @@ class QuestionnaireItemDatePickerViewHolderFactoryInstrumentedTest {
assertThat(viewHolder.itemView.findViewById<TextView>(R.id.text_input_edit_text).isEnabled)
.isFalse()
}

fun setLocale(locale: Locale) {
Locale.setDefault(locale)
context.resources.configuration.setLocale(locale)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,13 @@ import com.google.android.fhir.datacapture.validation.getSingleStringValidationM
import com.google.android.fhir.datacapture.views.DatePickerFragment.Companion.REQUEST_BUNDLE_KEY_DATE
import com.google.android.material.textfield.TextInputEditText
import com.google.android.material.textfield.TextInputLayout
import java.text.DateFormat
vvikramraj marked this conversation as resolved.
Show resolved Hide resolved
import java.text.SimpleDateFormat
import java.time.LocalDate
import java.time.ZoneId
import java.time.format.DateTimeFormatter
import java.util.Date
import java.util.Locale
import org.hl7.fhir.r4.model.DateType
import org.hl7.fhir.r4.model.QuestionnaireResponse

Expand Down Expand Up @@ -70,16 +75,8 @@ internal object QuestionnaireItemDatePickerViewHolderFactory :
val year = result.getInt(DatePickerFragment.RESULT_BUNDLE_KEY_YEAR)
val month = result.getInt(DatePickerFragment.RESULT_BUNDLE_KEY_MONTH)
val dayOfMonth = result.getInt(DatePickerFragment.RESULT_BUNDLE_KEY_DAY_OF_MONTH)
textInputEditText.setText(
LocalDate.of(
year,
// Month values are 1-12 in java.time but 0-11 in
// DatePickerDialog.
vvikramraj marked this conversation as resolved.
Show resolved Hide resolved
month + 1,
dayOfMonth
)
.format(LOCAL_DATE_FORMATTER)
)
val localDate = LocalDate.of(year, month + 1, dayOfMonth)
textInputEditText.setText(getLocalizedDate(localDate))

val date = DateType(year, month, dayOfMonth)
questionnaireItemViewItem.singleAnswerOrNull =
Expand Down Expand Up @@ -111,10 +108,7 @@ internal object QuestionnaireItemDatePickerViewHolderFactory :
}
textDateQuestion.text = questionnaireItemViewItem.questionnaireItem.localizedTextSpanned
textInputEditText.setText(
questionnaireItemViewItem.singleAnswerOrNull?.valueDateType?.localDate?.format(
LOCAL_DATE_FORMATTER
)
?: ""
getLocalizedDate(questionnaireItemViewItem.singleAnswerOrNull?.valueDateType?.localDate)
)
}

Expand Down Expand Up @@ -158,6 +152,12 @@ internal fun Context.tryUnwrapContext(): AppCompatActivity? {
}
}

internal fun getLocalizedDate(localDate: LocalDate?): String {
vvikramraj marked this conversation as resolved.
Show resolved Hide resolved
vvikramraj marked this conversation as resolved.
Show resolved Hide resolved
if (localDate == null) return ""
val instant = Date.from(localDate.atStartOfDay(ZoneId.systemDefault())?.toInstant())
return SimpleDateFormat.getDateInstance(DateFormat.DEFAULT, Locale.getDefault()).format(instant)
vvikramraj marked this conversation as resolved.
Show resolved Hide resolved
}

internal val DateType.localDate
get() =
LocalDate.of(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,12 @@ import androidx.lifecycle.viewModelScope
import com.google.android.fhir.FhirEngine
import com.google.android.fhir.logicalId
import com.google.android.fhir.search.search
import java.text.DateFormat
import java.text.SimpleDateFormat
import java.time.LocalDate
import java.time.ZoneId
import java.time.format.DateTimeFormatter
import java.util.Date
import java.util.Locale
import kotlinx.coroutines.launch
import org.apache.commons.lang3.StringUtils
Expand Down Expand Up @@ -108,7 +112,9 @@ class PatientDetailsViewModel(
)
)
data.add(
PatientDetailProperty(PatientProperty(getString(R.string.patient_property_dob), it.dob))
PatientDetailProperty(
PatientProperty(getString(R.string.patient_property_dob), getLocalizedDate(it.dob))
)
)
data.add(
PatientDetailProperty(
Expand Down Expand Up @@ -151,6 +157,13 @@ class PatientDetailsViewModel(
return data
}

private fun getLocalizedDate(date: String): String {
if (date.isEmpty()) return ""
val localDate: LocalDate = LocalDate.parse(date, DateTimeFormatter.ISO_DATE)
val instant = Date.from(localDate.atStartOfDay(ZoneId.systemDefault())?.toInstant())
return SimpleDateFormat.getDateInstance(DateFormat.DEFAULT, Locale.getDefault()).format(instant)
}
vvikramraj marked this conversation as resolved.
Show resolved Hide resolved

private fun getString(resId: Int) = getApplication<Application>().resources.getString(resId)

private suspend fun getPatientRiskAssessment(): RiskAssessmentItem {
Expand Down