From e64ea836f7e01559fe7e06017a599f7a6a426221 Mon Sep 17 00:00:00 2001 From: fy59 Date: Thu, 17 Sep 2026 17:18:05 +0200 Subject: [PATCH] fix(android): report completed generation sync --- .../com/labfytools/trainlog/data/SyncRequestOutbox.kt | 5 +++++ .../main/java/com/labfytools/trainlog/ui/SyncScreen.kt | 10 +++++++++- android/app/src/main/res/values-en/strings.xml | 1 + android/app/src/main/res/values/strings.xml | 1 + 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/android/app/src/main/java/com/labfytools/trainlog/data/SyncRequestOutbox.kt b/android/app/src/main/java/com/labfytools/trainlog/data/SyncRequestOutbox.kt index 768c0dc..b3d468e 100644 --- a/android/app/src/main/java/com/labfytools/trainlog/data/SyncRequestOutbox.kt +++ b/android/app/src/main/java/com/labfytools/trainlog/data/SyncRequestOutbox.kt @@ -14,6 +14,11 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext sealed interface SyncRequestResult { + /** The full-generation coordinator completed both durable peer ACKs. */ + data class Completed( + val runId: String, + ) : SyncRequestResult + data class Requested( val requestId: String, ) : SyncRequestResult diff --git a/android/app/src/main/java/com/labfytools/trainlog/ui/SyncScreen.kt b/android/app/src/main/java/com/labfytools/trainlog/ui/SyncScreen.kt index 741fadd..5797da1 100644 --- a/android/app/src/main/java/com/labfytools/trainlog/ui/SyncScreen.kt +++ b/android/app/src/main/java/com/labfytools/trainlog/ui/SyncScreen.kt @@ -55,7 +55,7 @@ internal suspend fun publishBundleAndRequest( } catch (_: Exception) { false } if (!enabled) return@withContext SyncRequestResult.Error("Invalid generation synchronization opt-in.") return@withContext when (val result = SyncGenerationForegroundCoordinator(repository).run(canonicalExchangeDirectory())) { - is ForegroundGenerationResult.Completed -> SyncRequestResult.Requested(result.runId) + is ForegroundGenerationResult.Completed -> SyncRequestResult.Completed(result.runId) is ForegroundGenerationResult.Error -> SyncRequestResult.Error(result.message) } } @@ -336,6 +336,14 @@ fun SyncScreen( coroutineScope.launch { try { when (val result = publishBundleAndRequest(repository, exporter, requestOutbox)) { + is SyncRequestResult.Completed -> { + // The generation coordinator has already consumed the + // desktop return and published its durable ACK. Waiting + // for the legacy receipt here would leave a false spinner. + success = true + pendingRequestId = null + status = strings.getString(R.string.sync_generation_complete) + } is SyncRequestResult.Requested -> { success = true pendingRequestId = result.requestId diff --git a/android/app/src/main/res/values-en/strings.xml b/android/app/src/main/res/values-en/strings.xml index dfbf59c..0a7c7d2 100644 --- a/android/app/src/main/res/values-en/strings.xml +++ b/android/app/src/main/res/values-en/strings.xml @@ -75,6 +75,7 @@ Android → PC then PC → Android, in one operation. File access is required. Authorize Documents/Trainlog first. Request sent · waiting for the PC… + Synchronization completed on Android and PC. Android is not supported. EXCHANGE FOLDER Authorize access to the Trainlog folder diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index 24f3075..8d14940 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -75,6 +75,7 @@ Android → PC puis PC → Android, en une seule opération. Accès fichiers requis. Autorisez d’abord Documents/Trainlog. Demande envoyée · attente du PC… + Synchronisation terminée sur Android et PC. Android non supporté. DOSSIER D’ÉCHANGE Autoriser l’accès au dossier Trainlog