Skip to content

Commit 3d9f2be

Browse files
authored
Merge branch 'master' into syncjob-status-callback
2 parents b519c23 + f42e804 commit 3d9f2be

File tree

164 files changed

+7914
-801
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

164 files changed

+7914
-801
lines changed

buildSrc/src/main/kotlin/Dependencies.kt

-13
Original file line numberDiff line numberDiff line change
@@ -87,14 +87,6 @@ object Dependencies {
8787
const val playServicesLocation =
8888
"com.google.android.gms:play-services-location:${Versions.playServicesLocation}"
8989

90-
const val androidFhirGroup = "com.google.android.fhir"
91-
const val androidFhirEngineModule = "engine"
92-
const val androidFhirKnowledgeModule = "knowledge"
93-
const val androidFhirCommon = "$androidFhirGroup:common:${Versions.androidFhirCommon}"
94-
const val androidFhirEngine =
95-
"$androidFhirGroup:$androidFhirEngineModule:${Versions.androidFhirEngine}"
96-
const val androidFhirKnowledge = "$androidFhirGroup:knowledge:${Versions.androidFhirKnowledge}"
97-
9890
const val apacheCommonsCompress =
9991
"org.apache.commons:commons-compress:${Versions.apacheCommonsCompress}"
10092

@@ -109,7 +101,6 @@ object Dependencies {
109101
const val mockWebServer = "com.squareup.okhttp3:mockwebserver:${Versions.http}"
110102

111103
const val jsonToolsPatch = "com.github.java-json-tools:json-patch:${Versions.jsonToolsPatch}"
112-
const val material = "com.google.android.material:material:${Versions.material}"
113104
const val sqlcipher = "net.zetetic:android-database-sqlcipher:${Versions.sqlcipher}"
114105
const val timber = "com.jakewharton.timber:timber:${Versions.timber}"
115106
const val woodstox = "com.fasterxml.woodstox:woodstox-core:${Versions.woodstox}"
@@ -131,9 +122,6 @@ object Dependencies {
131122
const val xmlUnit = "org.xmlunit:xmlunit-core:${Versions.xmlUnit}"
132123

133124
object Versions {
134-
const val androidFhirCommon = "0.1.0-alpha05"
135-
const val androidFhirEngine = "0.1.0-beta05"
136-
const val androidFhirKnowledge = "0.1.0-alpha03"
137125
const val apacheCommonsCompress = "1.21"
138126
const val desugarJdkLibs = "2.0.3"
139127
const val caffeine = "2.9.1"
@@ -154,7 +142,6 @@ object Dependencies {
154142

155143
const val jsonToolsPatch = "1.13"
156144
const val jsonAssert = "1.5.1"
157-
const val material = "1.9.0"
158145
const val retrofit = "2.9.0"
159146
const val gsonConverter = "2.1.0"
160147
const val sqlcipher = "4.5.4"

buildSrc/src/main/kotlin/Releases.kt

+8-2
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ object Releases {
4848

4949
object Engine : LibraryArtifact {
5050
override val artifactId = "engine"
51-
override val version = "1.0.0"
51+
override val version = "1.1.0"
5252
override val name = "Android FHIR Engine Library"
5353
}
5454

@@ -60,7 +60,7 @@ object Releases {
6060

6161
object Workflow : LibraryArtifact {
6262
override val artifactId = "workflow"
63-
override val version = "0.1.0-alpha04"
63+
override val version = "0.1.0-beta01"
6464
override val name = "Android FHIR Workflow Library"
6565
}
6666

@@ -98,6 +98,12 @@ object Releases {
9898
const val versionCode = 1
9999
const val versionName = "1.0"
100100
}
101+
102+
object WorkflowDemo {
103+
const val applicationId = "com.google.android.fhir.workflow.demo"
104+
const val versionCode = 1
105+
const val versionName = "1.0"
106+
}
101107
}
102108

103109
fun Project.publishArtifact(artifact: LibraryArtifact) {

catalog/build.gradle.kts

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,14 @@ dependencies {
4646

4747
coreLibraryDesugaring(Dependencies.desugarJdkLibs)
4848

49-
implementation(Dependencies.material)
5049
implementation(libs.androidx.appcompat)
5150
implementation(libs.androidx.constraintlayout)
5251
implementation(libs.androidx.core)
5352
implementation(libs.androidx.fragment)
5453
implementation(libs.androidx.navigation.fragment)
5554
implementation(libs.androidx.navigation.ui)
5655
implementation(libs.kotlin.stdlib)
56+
implementation(libs.material)
5757

5858
implementation(project(path = ":datacapture"))
5959
implementation(project(path = ":engine"))

catalog/src/main/assets/component_modal.json

+18-42
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,24 @@
22
"resourceType": "Questionnaire",
33
"item": [
44
{
5+
"extension": [
6+
{
7+
"url": "http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl",
8+
"valueCodeableConcept": {
9+
"coding": [
10+
{
11+
"system": "http://hl7.org/fhir/questionnaire-item-control",
12+
"code": "check-box",
13+
"display": "Check Box"
14+
}
15+
],
16+
"text": "Check box"
17+
}
18+
},
19+
{
20+
"url": "https://github.com/google/android-fhir/StructureDefinition/dialog"
21+
}
22+
],
523
"linkId": "1.1",
624
"type": "choice",
725
"repeats": true,
@@ -44,48 +62,6 @@
4462
"code": "diarrhoea",
4563
"display": "Diarrhoea"
4664
}
47-
},
48-
{
49-
"valueCoding": {
50-
"code": "fever",
51-
"display": "Fever"
52-
}
53-
},
54-
{
55-
"valueCoding": {
56-
"code": "injury",
57-
"display": "Injury"
58-
}
59-
},
60-
{
61-
"valueCoding": {
62-
"code": "jaundice",
63-
"display": "Jaundice"
64-
}
65-
},
66-
{
67-
"valueCoding": {
68-
"code": "mental-health",
69-
"display": "Mental health"
70-
}
71-
},
72-
{
73-
"valueCoding": {
74-
"code": "nausea",
75-
"display": "Nausea"
76-
}
77-
},
78-
{
79-
"valueCoding": {
80-
"code": "pain",
81-
"display": "Pain"
82-
}
83-
},
84-
{
85-
"valueCoding": {
86-
"code": "bleeding",
87-
"display": "Bleeding"
88-
}
8965
}
9066
]
9167
}

codelabs/datacapture/README.md

+10-10
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,8 @@ of the `app/build.gradle.kts` file of your project:
7676
dependencies {
7777
// ...
7878

79-
implementation("com.google.android.fhir:data-capture:1.0.0")
80-
implementation("androidx.fragment:fragment-ktx:1.5.5")
79+
implementation("com.google.android.fhir:data-capture:1.2.0")
80+
implementation("androidx.fragment:fragment-ktx:1.6.0")
8181
}
8282
```
8383

@@ -150,11 +150,11 @@ Open `MainActivity.kt` and add the following code to the `MainActivity` class:
150150

151151
```kotlin
152152
// Step 2: Configure a QuestionnaireFragment
153-
val questionnaireJsonString = getStringFromAssets("questionnaire.json")
153+
questionnaireJsonString = getStringFromAssets("questionnaire.json")
154+
155+
val questionnaireFragment =
156+
QuestionnaireFragment.builder().setQuestionnaire(questionnaireJsonString!!).build()
154157

155-
val questionnaireParams = bundleOf(
156-
QuestionnaireFragment.EXTRA_QUESTIONNAIRE_JSON_STRING to questionnaireJsonString
157-
)
158158
```
159159

160160
### Step 3: Add the QuestionnaireFragment to the FragmentContainerView
@@ -168,10 +168,10 @@ Add the following code to the `MainActivity` class:
168168
```kotlin
169169
// Step 3: Add the QuestionnaireFragment to the FragmentContainerView
170170
if (savedInstanceState == null) {
171-
supportFragmentManager.commit {
172-
setReorderingAllowed(true)
173-
add<QuestionnaireFragment>(R.id.fragment_container_view, args = questionnaireParams)
174-
}
171+
supportFragmentManager.commit {
172+
setReorderingAllowed(true)
173+
add(R.id.fragment_container_view, questionnaireFragment)
174+
}
175175
}
176176
// Submit button callback
177177
supportFragmentManager.setFragmentResultListener(

codelabs/engine/README.md

+8-2
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ file of your project:
125125
dependencies {
126126
// ...
127127
128-
implementation("com.google.android.fhir:engine:1.0.0")
128+
implementation("com.google.android.fhir:engine:1.1.0")
129129
}
130130
```
131131
@@ -257,7 +257,13 @@ outlined below will guide you through the process.
257257
258258
override fun getFhirEngine() = FhirApplication.fhirEngine(applicationContext)
259259
260-
override fun getUploadStrategy() = UploadStrategy.AllChangesSquashedBundlePut
260+
override fun getUploadStrategy() =
261+
UploadStrategy.forBundleRequest(
262+
methodForCreate = HttpCreateMethod.PUT,
263+
methodForUpdate = HttpUpdateMethod.PATCH,
264+
squash = true,
265+
bundleSize = 500,
266+
)
261267
}
262268
```
263269

codelabs/engine/app/build.gradle.kts

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,6 @@ dependencies {
4949
androidTestImplementation("androidx.test.ext:junit:1.2.1")
5050
androidTestImplementation("androidx.test.espresso:espresso-core:3.6.1")
5151

52-
implementation("com.google.android.fhir:engine:1.0.0")
52+
implementation("com.google.android.fhir:engine:1.1.0")
5353
implementation("androidx.fragment:fragment-ktx:1.8.3")
5454
}

codelabs/engine/app/src/main/java/com/google/android/fhir/codelabs/engine/PatientItemViewHolder.kt

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2023 Google LLC
2+
* Copyright 2023-2024 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.
@@ -30,8 +30,10 @@ class PatientItemViewHolder(binding: PatientListItemViewBinding) :
3030

3131
fun bind(patientItem: Patient) {
3232
nameTextView.text =
33-
patientItem.name.first().let { it.given.joinToString(separator = " ") + " " + it.family }
34-
genderTextView.text = patientItem.gender.display
33+
patientItem.name.firstOrNull()?.let {
34+
it.given.joinToString(separator = " ") + " " + it.family
35+
}
36+
genderTextView.text = patientItem.gender?.display
3537
cityTextView.text = patientItem.address.singleOrNull()?.city
3638
}
3739
}

contrib/barcode/build.gradle.kts

+1-1
Original file line numberDiff line numberDiff line change
@@ -70,11 +70,11 @@ dependencies {
7070
implementation(Dependencies.Mlkit.barcodeScanning)
7171
implementation(Dependencies.Mlkit.objectDetection)
7272
implementation(Dependencies.Mlkit.objectDetectionCustom)
73-
implementation(Dependencies.material)
7473
implementation(Dependencies.timber)
7574
implementation(libs.androidx.appcompat)
7675
implementation(libs.androidx.core)
7776
implementation(libs.androidx.fragment)
77+
implementation(libs.material)
7878

7979
testImplementation(Dependencies.mockitoInline)
8080
testImplementation(Dependencies.mockitoKotlin)

contrib/locationwidget/build.gradle.kts

+1-1
Original file line numberDiff line numberDiff line change
@@ -65,12 +65,12 @@ dependencies {
6565

6666
implementation(project(":datacapture"))
6767
implementation(Dependencies.playServicesLocation)
68-
implementation(Dependencies.material)
6968
implementation(Dependencies.timber)
7069
implementation(libs.androidx.appcompat)
7170
implementation(libs.androidx.core)
7271
implementation(libs.androidx.fragment)
7372
implementation(libs.kotlinx.coroutines.playservices)
73+
implementation(libs.material)
7474

7575
coreLibraryDesugaring(Dependencies.desugarJdkLibs)
7676

contrib/locationwidget/src/androidTest/java/com/google/android/fhir/datacapture/contrib/views/locationwidget/LocationGpsCoordinateViewHolderFactoryInstrumentedTest.kt

+27
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import androidx.core.view.isVisible
2727
import androidx.test.ext.junit.runners.AndroidJUnit4
2828
import androidx.test.platform.app.InstrumentationRegistry
2929
import com.google.common.truth.Truth.assertThat
30+
import org.hl7.fhir.r4.model.Questionnaire
3031
import org.junit.Before
3132
import org.junit.Test
3233
import org.junit.runner.RunWith
@@ -55,4 +56,30 @@ class LocationGpsCoordinateViewHolderFactoryInstrumentedTest {
5556
)
5657
.isEqualTo(InputType.TYPE_NULL)
5758
}
59+
60+
@Test
61+
fun matcherShouldReturnTrueForOriginalGpsCoordinateUrl() {
62+
val questionnaireItem = Questionnaire.QuestionnaireItemComponent()
63+
questionnaireItem.addExtension(
64+
LocationGpsCoordinateViewHolderFactory.PRIMARY_GPS_COORDINATE_EXTENSION_URL,
65+
null,
66+
)
67+
assertThat(LocationGpsCoordinateViewHolderFactory.matcher(questionnaireItem)).isTrue()
68+
}
69+
70+
@Test
71+
fun matcherShouldReturnTrueForOldGpsCoordinateUrl() {
72+
val questionnaireItem = Questionnaire.QuestionnaireItemComponent()
73+
questionnaireItem.addExtension(
74+
LocationGpsCoordinateViewHolderFactory.GPS_COORDINATE_EXTENSION_URL,
75+
null,
76+
)
77+
assertThat(LocationGpsCoordinateViewHolderFactory.matcher(questionnaireItem)).isTrue()
78+
}
79+
80+
@Test
81+
fun matcherShouldReturnFalseForNoGpsCoordinateUrl() {
82+
val questionnaireItem = Questionnaire.QuestionnaireItemComponent()
83+
assertThat(LocationGpsCoordinateViewHolderFactory.matcher(questionnaireItem)).isFalse()
84+
}
5885
}

contrib/locationwidget/src/main/java/com/google/android/fhir/datacapture/contrib/views/locationwidget/LocationGpsCoordinateViewHolderFactory.kt

+9-3
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,11 @@ object LocationGpsCoordinateViewHolderFactory :
5959
header.context.tryUnwrapContext()?.apply {
6060
val gpsCoordinateExtensionValue =
6161
questionnaireViewItem.questionnaireItem
62-
.getExtensionByUrl(GPS_COORDINATE_EXTENSION_URL)
63-
.value as StringType
62+
.getExtensionByUrl(PRIMARY_GPS_COORDINATE_EXTENSION_URL)
63+
?.value as? StringType
64+
?: questionnaireViewItem.questionnaireItem
65+
.getExtensionByUrl(GPS_COORDINATE_EXTENSION_URL)
66+
.value as StringType
6467
when (gpsCoordinateExtensionValue.valueAsString) {
6568
GPS_COORDINATE_EXTENSION_VALUE_LATITUDE -> {
6669
supportFragmentManager.setFragmentResultListener(
@@ -148,9 +151,12 @@ object LocationGpsCoordinateViewHolderFactory :
148151
}
149152

150153
fun matcher(questionnaireItem: Questionnaire.QuestionnaireItemComponent): Boolean {
151-
return questionnaireItem.hasExtension(GPS_COORDINATE_EXTENSION_URL)
154+
return questionnaireItem.hasExtension(PRIMARY_GPS_COORDINATE_EXTENSION_URL) ||
155+
questionnaireItem.hasExtension(GPS_COORDINATE_EXTENSION_URL)
152156
}
153157

158+
const val PRIMARY_GPS_COORDINATE_EXTENSION_URL =
159+
"https://github.com/google/android-fhir/StructureDefinition/gps-coordinate"
154160
const val GPS_COORDINATE_EXTENSION_URL = "gps-coordinate"
155161
const val GPS_COORDINATE_EXTENSION_VALUE_LATITUDE = "latitude"
156162
const val GPS_COORDINATE_EXTENSION_VALUE_LONGITUDE = "longitude"

datacapture/build.gradle.kts

+3-3
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,8 @@ dependencies {
9090
exclude(module = "commons-logging")
9191
exclude(module = "httpclient")
9292
}
93-
implementation(Dependencies.androidFhirCommon)
94-
implementation(Dependencies.material)
9593
implementation(Dependencies.timber)
94+
implementation(libs.android.fhir.common)
9695
implementation(libs.androidx.appcompat)
9796
implementation(libs.androidx.constraintlayout)
9897
implementation(libs.androidx.core)
@@ -101,12 +100,13 @@ dependencies {
101100
implementation(libs.glide)
102101
implementation(libs.kotlin.stdlib)
103102
implementation(libs.kotlinx.coroutines.core)
103+
implementation(libs.material)
104104

105105
testImplementation(Dependencies.mockitoInline)
106106
testImplementation(Dependencies.mockitoKotlin)
107107
testImplementation(Dependencies.robolectric)
108108
testImplementation(project(":knowledge")) {
109-
exclude(group = Dependencies.androidFhirGroup, module = Dependencies.androidFhirEngineModule)
109+
exclude(group = "com.google.android.fhir", module = "engine")
110110
}
111111
testImplementation(libs.androidx.test.core)
112112
testImplementation(libs.androidx.fragment.testing)

datacapture/src/main/java/com/google/android/fhir/datacapture/QuestionnaireEditAdapter.kt

+6-2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import androidx.recyclerview.widget.RecyclerView
2525
import com.google.android.fhir.datacapture.contrib.views.PhoneNumberViewHolderFactory
2626
import com.google.android.fhir.datacapture.extensions.inflate
2727
import com.google.android.fhir.datacapture.extensions.itemControl
28+
import com.google.android.fhir.datacapture.extensions.shouldUseDialog
2829
import com.google.android.fhir.datacapture.views.NavigationViewHolder
2930
import com.google.android.fhir.datacapture.views.QuestionnaireViewItem
3031
import com.google.android.fhir.datacapture.views.factories.AttachmentViewHolderFactory
@@ -241,8 +242,11 @@ internal class QuestionnaireEditAdapter(
241242
): QuestionnaireViewHolderType {
242243
val questionnaireItem = questionnaireViewItem.questionnaireItem
243244

244-
// Use the view type that the client wants if they specified an itemControl
245-
return questionnaireItem.itemControl?.viewHolderType
245+
// Use the view type that the client wants if they specified an itemControl or dialog extension
246+
return when {
247+
questionnaireItem.shouldUseDialog -> QuestionnaireViewHolderType.DIALOG_SELECT
248+
else -> questionnaireItem.itemControl?.viewHolderType
249+
}
246250
// Otherwise, choose a sensible UI element automatically
247251
?: run {
248252
val numOptions = questionnaireViewItem.enabledAnswerOptions.size

0 commit comments

Comments
 (0)