From ecf949a79cca940500727510c29adc619ce6a253 Mon Sep 17 00:00:00 2001 From: Madhuram Jajoo Date: Thu, 23 Jan 2025 17:51:14 +0530 Subject: [PATCH 1/5] Make existing work policy configurable in sync apis (#2765) --- engine/src/main/java/com/google/android/fhir/sync/Sync.kt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/engine/src/main/java/com/google/android/fhir/sync/Sync.kt b/engine/src/main/java/com/google/android/fhir/sync/Sync.kt index e4a3615605..c54a39685a 100644 --- a/engine/src/main/java/com/google/android/fhir/sync/Sync.kt +++ b/engine/src/main/java/com/google/android/fhir/sync/Sync.kt @@ -1,5 +1,5 @@ /* - * Copyright 2023-2024 Google LLC + * Copyright 2023-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. @@ -67,6 +67,7 @@ object Sync { inline fun oneTimeSync( context: Context, retryConfiguration: RetryConfiguration? = defaultRetryConfiguration, + existingWorkPolicy: ExistingWorkPolicy = ExistingWorkPolicy.KEEP, ): Flow { val uniqueWorkName = "${W::class.java.name}-oneTimeSync" val flow = getWorkerInfo(context, uniqueWorkName) @@ -75,7 +76,7 @@ object Sync { WorkManager.getInstance(context) .enqueueUniqueWork( uniqueWorkName, - ExistingWorkPolicy.KEEP, + existingWorkPolicy, oneTimeWorkRequest, ) return combineSyncStateForOneTimeSync(context, uniqueWorkName, flow) @@ -95,6 +96,7 @@ object Sync { inline fun periodicSync( context: Context, periodicSyncConfiguration: PeriodicSyncConfiguration, + existingPeriodicWorkPolicy: ExistingPeriodicWorkPolicy = ExistingPeriodicWorkPolicy.KEEP, ): Flow { val uniqueWorkName = "${W::class.java.name}-periodicSync" val flow = getWorkerInfo(context, uniqueWorkName) @@ -103,7 +105,7 @@ object Sync { WorkManager.getInstance(context) .enqueueUniquePeriodicWork( uniqueWorkName, - ExistingPeriodicWorkPolicy.KEEP, + existingPeriodicWorkPolicy, periodicWorkRequest, ) return combineSyncStateForPeriodicSync(context, uniqueWorkName, flow) From b483ed05023912312ca3b4ea0fcc9d82b25a9acd Mon Sep 17 00:00:00 2001 From: Madhuram Jajoo Date: Wed, 29 Jan 2025 09:45:54 +0530 Subject: [PATCH 2/5] Bump the engine version to 1.2.0 (#2776) * Bump the engine version to 1.2.0 * spotless apply --- buildSrc/src/main/kotlin/Releases.kt | 4 ++-- docs/use/api.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/buildSrc/src/main/kotlin/Releases.kt b/buildSrc/src/main/kotlin/Releases.kt index 4a5a54d064..c11dadf00c 100644 --- a/buildSrc/src/main/kotlin/Releases.kt +++ b/buildSrc/src/main/kotlin/Releases.kt @@ -1,5 +1,5 @@ /* - * Copyright 2023-2024 Google LLC + * Copyright 2023-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. @@ -48,7 +48,7 @@ object Releases { object Engine : LibraryArtifact { override val artifactId = "engine" - override val version = "1.1.0" + override val version = "1.2.0" override val name = "Android FHIR Engine Library" } diff --git a/docs/use/api.md b/docs/use/api.md index 84f73cc8d8..3e0087476b 100644 --- a/docs/use/api.md +++ b/docs/use/api.md @@ -1,6 +1,6 @@ # API -* [Engine](api/engine/1.1.0/index.html) +* [Engine](api/engine/1.2.0/index.html) * [Data Capture](api/data-capture/1.2.0/index.html) * [Workflow](api/workflow/0.1.0-beta01/index.html) * [Knowledge](api/knowledge/0.1.0-beta01/index.html) From 36e2ccfeee4eaf92e3960b5f5d04e64d395a091a Mon Sep 17 00:00:00 2001 From: Rahul Malhotra <16497903+rahulmalhotra@users.noreply.github.com> Date: Wed, 29 Jan 2025 11:49:17 +0530 Subject: [PATCH 3/5] Highlight form fields that fail validation when submit button is clicked (#2722) --- .../fhir/datacapture/QuestionnaireViewModel.kt | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/QuestionnaireViewModel.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/QuestionnaireViewModel.kt index ecc019b0a8..e96bd28a50 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/QuestionnaireViewModel.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/QuestionnaireViewModel.kt @@ -1,5 +1,5 @@ /* - * Copyright 2023-2024 Google LLC + * Copyright 2023-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. @@ -298,12 +298,6 @@ internal class QuestionnaireViewModel(application: Application, state: SavedStat private lateinit var currentPageItems: List - /** - * True if the user has tapped the next/previous pagination buttons on the current page. This is - * needed to avoid spewing validation errors before any questions are answered. - */ - private var forceValidation = false - /** * Map of [QuestionnaireResponseItemAnswerComponent] for * [Questionnaire.QuestionnaireItemComponent]s that are disabled now. The answers will be used to @@ -903,7 +897,6 @@ internal class QuestionnaireViewModel(application: Application, state: SavedStat val validationResult = if ( modifiedQuestionnaireResponseItemSet.contains(questionnaireResponseItem) || - forceValidation || isInReviewModeFlow.value ) { questionnaireResponseItemValidator.validate( @@ -1124,13 +1117,14 @@ internal class QuestionnaireViewModel(application: Application, state: SavedStat it.item.validationResult is NotValidated } ) { - // Force update validation results for all questions on the current page. This is needed - // when the user has not answered any questions so no validation has been done. - forceValidation = true + // Add all items on the current page to modifiedQuestionnaireResponseItemSet. + // This will ensure that all fields are validated even when they're not filled by the user + currentPageItems.filterIsInstance().forEach { + modifiedQuestionnaireResponseItemSet.add(it.item.getQuestionnaireResponseItem()) + } // Results in a new questionnaire state being generated synchronously, i.e., the current // thread will be suspended until the new state is generated. modificationCount.update { it + 1 } - forceValidation = false } if ( From be94dd532676a79cfa7723931a3f39d92722f0c8 Mon Sep 17 00:00:00 2001 From: santosh-pingle <86107848+santosh-pingle@users.noreply.github.com> Date: Wed, 29 Jan 2025 14:27:14 +0530 Subject: [PATCH 4/5] api support for sync job cancellation. (#2717) * cancel api to cancel the sync job. * remove commented code. * datastore to store uuid. * code cleanup. --------- Co-authored-by: Santosh Pingle --- .../android/fhir/demo/PeriodicSyncFragment.kt | 28 ++- .../fhir/demo/PeriodicSyncViewModel.kt | 45 ++-- .../google/android/fhir/demo/SyncFragment.kt | 29 ++- .../fhir/demo/SyncFragmentViewModel.kt | 12 +- demo/src/main/res/layout/periodic_sync.xml | 38 +++ demo/src/main/res/layout/sync.xml | 18 ++ .../android/fhir/sync/SyncInstrumentedTest.kt | 231 +++++++++++------- .../google/android/fhir/sync/FhirDataStore.kt | 39 ++- .../java/com/google/android/fhir/sync/Sync.kt | 187 ++++++++------ 9 files changed, 441 insertions(+), 186 deletions(-) diff --git a/demo/src/main/java/com/google/android/fhir/demo/PeriodicSyncFragment.kt b/demo/src/main/java/com/google/android/fhir/demo/PeriodicSyncFragment.kt index 4fc6d3c830..912ebbf517 100644 --- a/demo/src/main/java/com/google/android/fhir/demo/PeriodicSyncFragment.kt +++ b/demo/src/main/java/com/google/android/fhir/demo/PeriodicSyncFragment.kt @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2024-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. @@ -21,6 +21,7 @@ import android.view.LayoutInflater import android.view.MenuItem import android.view.View import android.view.ViewGroup +import android.widget.Button import android.widget.ProgressBar import android.widget.TextView import androidx.appcompat.app.AppCompatActivity @@ -48,6 +49,7 @@ class PeriodicSyncFragment : Fragment() { setUpActionBar() setHasOptionsMenu(true) refreshPeriodicSynUi() + setUpSyncButtons(view) } override fun onOptionsItemSelected(item: MenuItem): Boolean { @@ -67,6 +69,30 @@ class PeriodicSyncFragment : Fragment() { } } + private fun setUpSyncButtons(view: View) { + val syncNowButton = view.findViewById