Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/master' into master-release
Browse files Browse the repository at this point in the history
  • Loading branch information
ndegwamartin committed Jun 21, 2024
2 parents 865fdae + 18d5e53 commit 45d48aa
Show file tree
Hide file tree
Showing 56 changed files with 2,105 additions and 263 deletions.
15 changes: 14 additions & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ jobs:
permissions:
actions: read
contents: read
packages: write

strategy:
fail-fast: false
Expand All @@ -75,9 +76,21 @@ jobs:
- name: Check with Gradle
run: ./gradlew check --scan --full-stacktrace

- name: Publish Maven packages to GitHub Packages
if: ${{ github.event_name == 'push' }}
run: ./gradlew publish
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
REPOSITORY_URL: 'https://maven.pkg.github.com/google/android-fhir'
# Use SNAPSHOT Prefix to follow Maven convention
ARTIFACT_VERSION_SUFFIX: SNAPSHOT

- name: Release artifacts to local repo
run: ./gradlew publishReleasePublicationToCIRepository --scan
- name: Upload maven repo
env:
ARTIFACT_VERSION_SUFFIX: build_${{ github.run_id }}

- name: Upload artifact maven-repository.zip
uses: actions/upload-artifact@v4
with:
name: maven-repository
Expand Down
7 changes: 4 additions & 3 deletions Pipfile.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion buildSrc/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,5 @@ dependencies {
implementation("com.spotify.ruler:ruler-gradle-plugin:1.4.0")

implementation("ca.uhn.hapi.fhir:hapi-fhir-structures-r4:6.10.0")
implementation("com.squareup:kotlinpoet:1.15.3")
implementation("com.squareup:kotlinpoet:1.17.0")
}
19 changes: 16 additions & 3 deletions buildSrc/src/main/kotlin/Releases.kt
Original file line number Diff line number Diff line change
Expand Up @@ -119,20 +119,33 @@ fun Project.publishArtifact(artifact: LibraryArtifact) {
licenses {
license {
name.set("The Apache License, Version 2.0")
url.set("http://www.apache.org/licenses/LICENSE-2.0.txt")
url.set("https://www.apache.org/licenses/LICENSE-2.0.txt")
}
}
}
repositories {
maven {
name = "CI"
url = uri("file://${rootProject.buildDir}/ci-repo")
url =
if (System.getenv("REPOSITORY_URL") != null) {
// REPOSITORY_URL is defined in .github/workflows/build.yml
uri(System.getenv("REPOSITORY_URL"))
} else {
uri("file://${rootProject.buildDir}/ci-repo")
}
version =
if (project.providers.environmentVariable("GITHUB_ACTIONS").isPresent) {
"${artifact.version}-build_${System.getenv("GITHUB_RUN_ID")}"
// ARTIFACT_VERSION_SUFFIX is defined in .github/workflows/build.yml
"${artifact.version}-${System.getenv("ARTIFACT_VERSION_SUFFIX")}"
} else {
artifact.version
}
if (System.getenv("GITHUB_TOKEN") != null) {
credentials {
username = System.getenv("GITHUB_ACTOR")
password = System.getenv("GITHUB_TOKEN")
}
}
}
// Weird quirk, build fails with this entry. Reverting to individual configuration per
// module
Expand Down
4 changes: 2 additions & 2 deletions catalog/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ android {

buildTypes {
release {
isMinifyEnabled = false
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"))
isMinifyEnabled = true
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
}
}
compileOptions {
Expand Down
21 changes: 21 additions & 0 deletions catalog/proguard-rules.pro
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.kts
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}

# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable

# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
1 change: 1 addition & 0 deletions datacapture/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ android {
testInstrumentationRunner = Dependencies.androidJunitRunner
// Need to specify this to prevent junit runner from going deep into our dependencies
testInstrumentationRunnerArguments["package"] = "com.google.android.fhir.datacapture"
consumerProguardFile("proguard-rules.pro")
}

buildFeatures { viewBinding = true }
Expand Down
11 changes: 11 additions & 0 deletions datacapture/proguard-rules.pro
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
## HAPI Strucutres need to be kept beause
# 1. Reflection is used in resource extraction as the FHIR Path expression is then translated to field names to locate data elements in FHIR resources.
# 2. In HAPI Strucures, ClassLoader is used to load classes from different packages that are hardcoded.
-keep class ca.uhn.fhir.** { *; }
-keep class org.hl7.fhir.** { *; }
# Used by hapi's XmlUtil which is internally used by hapi's FHIRPathEngine.
-keep class com.ctc.wstx.stax.** { *; }
# Used by HapiWorkerContext (fhirpath engine in QuestionnaireViewModel)
-keep class com.github.benmanes.caffeine.cache.** { *; }
## hapi libs ends
-ignorewarnings
Original file line number Diff line number Diff line change
Expand Up @@ -32,5 +32,6 @@ internal sealed interface QuestionnaireAdapterItem {
val onDeleteClicked: () -> Unit,
/** Responses nested under this header. */
val responses: List<QuestionnaireResponse.QuestionnaireResponseItemComponent>,
val title: String,
) : QuestionnaireAdapterItem
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ package com.google.android.fhir.datacapture

import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
Expand All @@ -43,6 +42,7 @@ import com.google.android.fhir.datacapture.views.factories.QuantityViewHolderFac
import com.google.android.fhir.datacapture.views.factories.QuestionnaireItemDialogSelectViewHolderFactory
import com.google.android.fhir.datacapture.views.factories.QuestionnaireItemViewHolder
import com.google.android.fhir.datacapture.views.factories.RadioGroupViewHolderFactory
import com.google.android.fhir.datacapture.views.factories.RepeatedGroupHeaderItemViewHolder
import com.google.android.fhir.datacapture.views.factories.SliderViewHolderFactory
import org.hl7.fhir.r4.model.Questionnaire.QuestionnaireItemType

Expand All @@ -64,7 +64,9 @@ internal class QuestionnaireEditAdapter(
ViewHolder.QuestionHolder(onCreateViewHolderQuestion(parent = parent, subtype = subtype))
ViewType.Type.REPEATED_GROUP_HEADER -> {
ViewHolder.RepeatedGroupHeaderHolder(
parent.inflate(R.layout.repeated_group_instance_header_view),
RepeatedGroupHeaderItemViewHolder(
parent.inflate(R.layout.repeated_group_instance_header_view),
),
)
}
}
Expand Down Expand Up @@ -118,8 +120,7 @@ internal class QuestionnaireEditAdapter(
}
is QuestionnaireAdapterItem.RepeatedGroupHeader -> {
holder as ViewHolder.RepeatedGroupHeaderHolder
holder.header.text = "Group ${item.index + 1}"
holder.delete.setOnClickListener { item.onDeleteClicked() }
holder.viewHolder.bind(item)
}
}
}
Expand Down Expand Up @@ -266,10 +267,8 @@ internal class QuestionnaireEditAdapter(
internal sealed class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
class QuestionHolder(val holder: QuestionnaireItemViewHolder) : ViewHolder(holder.itemView)

class RepeatedGroupHeaderHolder(itemView: View) : ViewHolder(itemView) {
val header: TextView = itemView.findViewById(R.id.repeated_group_instance_header_title)
val delete: View = itemView.findViewById(R.id.repeated_group_instance_header_delete_button)
}
class RepeatedGroupHeaderHolder(val viewHolder: RepeatedGroupHeaderItemViewHolder) :
ViewHolder(viewHolder.itemView)
}

internal companion object {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -154,11 +154,9 @@ internal class QuestionnaireViewModel(application: Application, state: SavedStat
}
// Retain the hierarchy and order of items within the questionnaire as specified in the
// standard. See https://www.hl7.org/fhir/questionnaireresponse.html#notes.
questionnaire.item.forEach {
if (it.type != Questionnaire.QuestionnaireItemType.GROUP || !it.repeats) {
questionnaireResponse.addItem(it.createQuestionnaireResponseItem())
}
}
questionnaire.item
.filterNot { it.isRepeatedGroup }
.forEach { questionnaireResponse.addItem(it.createQuestionnaireResponseItem()) }
}
}
questionnaireResponse.packRepeatedGroups(questionnaire)
Expand Down Expand Up @@ -847,6 +845,7 @@ internal class QuestionnaireViewModel(application: Application, state: SavedStat
index = index,
onDeleteClicked = { viewModelScope.launch { question.item.removeAnswerAt(index) } },
responses = nestedResponseItemList,
title = question.item.questionText?.toString() ?: "",
),
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ package com.google.android.fhir.datacapture.contrib.views
import android.text.Editable
import android.text.InputType
import com.google.android.fhir.datacapture.R
import com.google.android.fhir.datacapture.extensions.getValidationErrorMessage
import com.google.android.fhir.datacapture.views.QuestionnaireViewItem
import com.google.android.fhir.datacapture.views.factories.QuestionnaireItemEditTextViewHolderDelegate
import com.google.android.fhir.datacapture.views.factories.QuestionnaireItemViewHolderDelegate
Expand Down Expand Up @@ -58,16 +59,27 @@ object PhoneNumberViewHolderFactory :
}
}

override fun updateUI(
override fun updateInputTextUI(
questionnaireViewItem: QuestionnaireViewItem,
textInputEditText: TextInputEditText,
textInputLayout: TextInputLayout,
) {
val text =
questionnaireViewItem.answers.singleOrNull()?.valueStringType?.value?.toString() ?: ""
if (text != textInputEditText.text.toString()) {
textInputEditText.setText(text)
}
}

override fun updateValidationTextUI(
questionnaireViewItem: QuestionnaireViewItem,
textInputLayout: TextInputLayout,
) {
textInputLayout.error =
getValidationErrorMessage(
textInputLayout.context,
questionnaireViewItem,
questionnaireViewItem.validationResult,
)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -915,7 +915,9 @@ fun Questionnaire.QuestionnaireItemComponent.createQuestionnaireResponseItem():
!repeats
) {
this@createQuestionnaireResponseItem.item.forEach {
this.addItem(it.createQuestionnaireResponseItem())
if (!it.isRepeatedGroup) {
this.addItem(it.createQuestionnaireResponseItem())
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ package com.google.android.fhir.datacapture.views.factories
import android.text.Editable
import android.text.InputType
import com.google.android.fhir.datacapture.R
import com.google.android.fhir.datacapture.extensions.getValidationErrorMessage
import com.google.android.fhir.datacapture.views.QuestionnaireViewItem
import com.google.android.material.textfield.TextInputEditText
import com.google.android.material.textfield.TextInputLayout
Expand All @@ -43,10 +44,9 @@ internal object EditTextDecimalViewHolderFactory :
?: questionnaireViewItem.setDraftAnswer(editable.toString())
}

override fun updateUI(
override fun updateInputTextUI(
questionnaireViewItem: QuestionnaireViewItem,
textInputEditText: TextInputEditText,
textInputLayout: TextInputLayout,
) {
val questionnaireItemViewItemDecimalAnswer =
questionnaireViewItem.answers.singleOrNull()?.valueDecimalType?.value?.toString()
Expand All @@ -62,10 +62,22 @@ internal object EditTextDecimalViewHolderFactory :
} else if (draftAnswer != null && draftAnswer != textInputEditText.text.toString()) {
textInputEditText.setText(draftAnswer)
}
}

override fun updateValidationTextUI(
questionnaireViewItem: QuestionnaireViewItem,
textInputLayout: TextInputLayout,
) {
textInputLayout.error =
getValidationErrorMessage(
textInputLayout.context,
questionnaireViewItem,
questionnaireViewItem.validationResult,
)
// Update error message if draft answer present
if (draftAnswer != null) {
if (questionnaireViewItem.draftAnswer != null) {
textInputLayout.error =
textInputEditText.context.getString(R.string.decimal_format_validation_error_msg)
textInputLayout.context.getString(R.string.decimal_format_validation_error_msg)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import android.text.Editable
import android.text.InputType
import androidx.annotation.RequiresApi
import com.google.android.fhir.datacapture.R
import com.google.android.fhir.datacapture.extensions.getValidationErrorMessage
import com.google.android.fhir.datacapture.views.QuestionnaireViewItem
import com.google.android.material.textfield.TextInputEditText
import com.google.android.material.textfield.TextInputLayout
Expand Down Expand Up @@ -58,10 +59,9 @@ internal object EditTextIntegerViewHolderFactory :
}
}

override fun updateUI(
override fun updateInputTextUI(
questionnaireViewItem: QuestionnaireViewItem,
textInputEditText: TextInputEditText,
textInputLayout: TextInputLayout,
) {
val answer =
questionnaireViewItem.answers.singleOrNull()?.valueIntegerType?.value?.toString()
Expand All @@ -78,11 +78,22 @@ internal object EditTextIntegerViewHolderFactory :
} else if (draftAnswer != null && draftAnswer != textInputEditText.text.toString()) {
textInputEditText.setText(draftAnswer)
}
}

override fun updateValidationTextUI(
questionnaireViewItem: QuestionnaireViewItem,
textInputLayout: TextInputLayout,
) {
textInputLayout.error =
getValidationErrorMessage(
textInputLayout.context,
questionnaireViewItem,
questionnaireViewItem.validationResult,
)
// Update error message if draft answer present
if (draftAnswer != null) {
if (questionnaireViewItem.draftAnswer != null) {
textInputLayout.error =
textInputEditText.context.getString(
textInputLayout.context.getString(
R.string.integer_format_validation_error_msg,
formatInteger(Int.MIN_VALUE),
formatInteger(Int.MAX_VALUE),
Expand Down
Loading

0 comments on commit 45d48aa

Please sign in to comment.