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