diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/QuestionnaireEditAdapter.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/QuestionnaireEditAdapter.kt index c1df3c0f9f..6e6e610f43 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/QuestionnaireEditAdapter.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/QuestionnaireEditAdapter.kt @@ -35,6 +35,7 @@ import com.google.android.fhir.datacapture.views.factories.EditTextIntegerViewHo import com.google.android.fhir.datacapture.views.factories.EditTextMultiLineViewHolderFactory import com.google.android.fhir.datacapture.views.factories.EditTextSingleLineViewHolderFactory import com.google.android.fhir.datacapture.views.factories.GroupViewHolderFactory +import com.google.android.fhir.datacapture.views.factories.LocationWidgetViewHolderFactory import com.google.android.fhir.datacapture.views.factories.QuantityViewHolderFactory import com.google.android.fhir.datacapture.views.factories.QuestionnaireItemDialogSelectViewHolderFactory import com.google.android.fhir.datacapture.views.factories.QuestionnaireItemViewHolder @@ -95,6 +96,7 @@ internal class QuestionnaireEditAdapter( QuestionnaireViewHolderType.SLIDER -> SliderViewHolderFactory QuestionnaireViewHolderType.PHONE_NUMBER -> PhoneNumberViewHolderFactory QuestionnaireViewHolderType.ATTACHMENT -> AttachmentViewHolderFactory + QuestionnaireViewHolderType.LOCATION_WIDGET -> LocationWidgetViewHolderFactory } return viewHolderFactory.create(parent) } diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/QuestionnaireViewHolderType.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/QuestionnaireViewHolderType.kt index 5a64806841..083c3dd3fa 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/QuestionnaireViewHolderType.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/QuestionnaireViewHolderType.kt @@ -45,6 +45,7 @@ enum class QuestionnaireViewHolderType(val value: Int) { SLIDER(15), PHONE_NUMBER(16), ATTACHMENT(17), + LOCATION_WIDGET(18), ; companion object { diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreQuestionnaireItemComponents.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreQuestionnaireItemComponents.kt index 5ae1cd30b8..cccdae4f75 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreQuestionnaireItemComponents.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreQuestionnaireItemComponents.kt @@ -170,6 +170,7 @@ enum class ItemControlTypes( RADIO_BUTTON("radio-button", QuestionnaireViewHolderType.RADIO_GROUP), SLIDER("slider", QuestionnaireViewHolderType.SLIDER), PHONE_NUMBER("phone-number", QuestionnaireViewHolderType.PHONE_NUMBER), + LOCATION_WIDGET("location-widget", QuestionnaireViewHolderType.LOCATION_WIDGET), } /** diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/factories/LocationWidgetViewHolderFactory.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/factories/LocationWidgetViewHolderFactory.kt new file mode 100644 index 0000000000..f907dc9a75 --- /dev/null +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/factories/LocationWidgetViewHolderFactory.kt @@ -0,0 +1,49 @@ +/* + * Copyright 2023 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.fhir.datacapture.views.factories + +import android.view.View +import com.google.android.fhir.datacapture.R +import com.google.android.fhir.datacapture.views.HeaderView +import com.google.android.fhir.datacapture.views.QuestionnaireViewItem +import com.google.android.material.textfield.MaterialAutoCompleteTextView + +internal object LocationWidgetViewHolderFactory : + QuestionnaireItemViewHolderFactory(R.layout.location_widget_view) { + override fun getQuestionnaireItemViewHolderDelegate(): QuestionnaireItemViewHolderDelegate = + object : QuestionnaireItemViewHolderDelegate { + private lateinit var header: HeaderView + private lateinit var autoCompleteTextView: MaterialAutoCompleteTextView + + override lateinit var questionnaireViewItem: QuestionnaireViewItem + + override fun init(itemView: View) { + header = itemView.findViewById(R.id.header) + autoCompleteTextView = itemView.findViewById(R.id.autoCompleteTextView) + } + + override fun bind(questionnaireViewItem: QuestionnaireViewItem) { + header.bind(questionnaireViewItem) + autoCompleteTextView.setText("-83.694710, 42.256500, 0") // todo: + autoCompleteTextView.setAdapter(null) + } + + override fun setReadOnly(isReadOnly: Boolean) { + // TODO("Not yet implemented") + } + } +} diff --git a/datacapture/src/main/res/drawable/gm_location_on_24.xml b/datacapture/src/main/res/drawable/gm_location_on_24.xml new file mode 100644 index 0000000000..2a6b5d6728 --- /dev/null +++ b/datacapture/src/main/res/drawable/gm_location_on_24.xml @@ -0,0 +1,13 @@ + + + diff --git a/datacapture/src/main/res/layout/display_view.xml b/datacapture/src/main/res/layout/display_view.xml index 6529da065b..f5defa44ff 100644 --- a/datacapture/src/main/res/layout/display_view.xml +++ b/datacapture/src/main/res/layout/display_view.xml @@ -29,10 +29,7 @@ android:layout_height="wrap_content" /> - + + diff --git a/datacapture/src/main/res/layout/location_widget_view.xml b/datacapture/src/main/res/layout/location_widget_view.xml new file mode 100644 index 0000000000..d928e11b62 --- /dev/null +++ b/datacapture/src/main/res/layout/location_widget_view.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + diff --git a/demo/src/main/assets/test-location-widget.json b/demo/src/main/assets/test-location-widget.json new file mode 100644 index 0000000000..b181436655 --- /dev/null +++ b/demo/src/main/assets/test-location-widget.json @@ -0,0 +1,53 @@ +{ + "resourceType": "Questionnaire", + "language": "en", + "status": "active", + "date": "2020-11-18T07:24:47.111Z", + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-launchContext", + "extension": [ + { + "url": "name", + "valueCoding": { + "system": "http://hl7.org/fhir/uv/sdc/CodeSystem/launchContext", + "code": "client", + "display": "Client as a Patient" + } + }, + { + "url": "type", + "valueCode": "Patient" + } + ] + } + ], + "item": [ + { + "linkId": "PR", + "type": "group", + "text": "Test Group", + "item": [ + { + "linkId": "Location widget", + "type": "string", + "text": "Record GPS Location", + "required": true, + "extension": [ + { + "url": "https://github.com/google/android-fhir/StructureDefinition/questionnaire-itemControl", + "valueCodeableConcept": { + "coding": [ + { + "system": "https://github.com/google/android-fhir/questionnaire-item-control", + "code": "location-widget" + } + ] + } + } + ] + } + ] + } + ] +} diff --git a/demo/src/main/java/com/google/android/fhir/demo/AddPatientFragment.kt b/demo/src/main/java/com/google/android/fhir/demo/AddPatientFragment.kt index 8712d12407..c6f42bd910 100644 --- a/demo/src/main/java/com/google/android/fhir/demo/AddPatientFragment.kt +++ b/demo/src/main/java/com/google/android/fhir/demo/AddPatientFragment.kt @@ -78,7 +78,8 @@ class AddPatientFragment : Fragment(R.layout.add_patient_fragment) { private fun updateArguments() { requireArguments() - .putString(QUESTIONNAIRE_FILE_PATH_KEY, "new-patient-registration-paginated.json") + // .putString(QUESTIONNAIRE_FILE_PATH_KEY, "new-patient-registration-paginated.json") + .putString(QUESTIONNAIRE_FILE_PATH_KEY, "test-location-widget.json") } private fun addQuestionnaireFragment() {