Prevent Sync Failure When App is in the Background#3836
Open
qiarie wants to merge 6 commits into
Open
Conversation
On Android 12+ (API 31+), calling setForeground() while the app is in the background throws ForegroundServiceStartNotAllowedException. Previously, this call was grouped with the sync logic, causing the entire worker to fail and stop progressing if the periodic sync triggered while the app was not in the foreground. Changes: - Isolated setForeground() in an independent runCatching block to ensure sync proceeds even if the foreground notification cannot be started. - Refactored doWork() to use a try-catch block for more robust exception handling and proper result propagation.
* ⬆️ Update FHIR SDK dependencies * ⬇️ Downgrade SDK dependencies Downgraded barcode, locationwidget and sdk-data-capture versions * ⬆️ Upgrade Kujaku lib
…in-the-background
* Add version info to the output APK filename * Remove lingering sync overlay scrim on low-resource devices After initial sync hits 100% the progress dialog content disappears but its full-screen scrim could remain on screen, blocking all touch and rendering the app unusable. On fast devices this is invisible; on slower devices the orphaned scrim is long-lived or permanent, and appears to persist across app restarts. Root cause: LoaderDialog had two unsynchronized dismiss paths. LoaderContent self-hid its content via a SideEffect at >=100% (during the Running phase), but the Compose Dialog window - and its scrim - was only torn down when the caller's isFirstTimeSync flag flipped to false on terminal Succeeded. The gap between the two left an empty, touch-blocking dim layer, and the isFirstTimeSync recompute was itself fragile (cross-listener ordering, a stale record-count read, and coupling to data presence rather than to sync completion). Drive dialog dismissal from a single authoritative signal: - LoaderDialog: drop LoaderContent's local openDialog state and the 100% SideEffect so content and Dialog window appear and disappear together, gated solely by the caller - RegisterScreen: gate the dialog on isFirstTimeSync && !syncTerminated, where syncTerminated covers terminal CurrentSyncJobStatus (Succeeded or Failed), so the scrim is torn down on the same event delivered to all listeners - RegisterViewModel: recompute isFirstTimeSync after the register count resolves (re-emit RegisterUiState from inside the count coroutine) to remove the stale-count race * Comments cleanup * Remove BaseVariantOutputImpl qualified import * Run spotlessApply
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
On Android 12+ (API 31+), calling setForeground() while the app is in the background throws ForegroundServiceStartNotAllowedException. Previously, this call was grouped with the sync logic, causing the entire worker to fail and stop progressing if the periodic sync triggered while the app was not in the foreground.
Changes:
IMPORTANT: Where possible all PRs must be linked to a Github issue
Fixes [link to issue]
Engineer Checklist
strings.xmlfile./gradlew spotlessApplyand./gradlew spotlessCheckto check my code follows the project's style guideCode Reviewer Checklist
strings.xmlfile