From 16232e2f9f1f369c50dc5e00889b4d9253ab753a Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Fri, 12 Jun 2026 13:01:18 -0400 Subject: [PATCH] Fix transfer control showing stale data or not responding. --- .../transfercontrols/TransferControlView.kt | 19 ++++++++++++++----- .../transfercontrols/TransferControls.kt | 6 +++++- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/transfercontrols/TransferControlView.kt b/app/src/main/java/org/thoughtcrime/securesms/components/transfercontrols/TransferControlView.kt index 1ee66e5af4..b43c60b08f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/transfercontrols/TransferControlView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/transfercontrols/TransferControlView.kt @@ -90,13 +90,22 @@ class TransferControlView @JvmOverloads constructor(context: Context, attrs: Att val newRender = TransferControls.deriveRenderState(newState) state = newState - if (oldRender != newRender) { - verboseLog { "render $oldRender -> $newRender slides=[${slidesAsLogString(newState.slides)}]" } + if (oldRender == newRender) { + return + } + + verboseLog { "render $oldRender -> $newRender slides=[${slidesAsLogString(newState.slides)}]" } + + if (oldRender is TransferControlsRenderState.InProgress && oldRender.isProgressOnlyDifference(newRender)) { progressUpdateDebouncer.publish { renderState = newRender - if (newRender !is TransferControlsRenderState.Gone) { - visibility = VISIBLE - } + visibility = VISIBLE + } + } else { + progressUpdateDebouncer.clear() + renderState = newRender + if (newRender !is TransferControlsRenderState.Gone) { + visibility = VISIBLE } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/transfercontrols/TransferControls.kt b/app/src/main/java/org/thoughtcrime/securesms/components/transfercontrols/TransferControls.kt index 61a588acfe..4a9bf46126 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/transfercontrols/TransferControls.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/transfercontrols/TransferControls.kt @@ -319,7 +319,11 @@ sealed interface TransferControlsRenderState { val showPlayButton: Boolean, val cancelable: Boolean, val label: TransferControls.ProgressLabel? - ) : TransferControlsRenderState + ) : TransferControlsRenderState { + fun isProgressOnlyDifference(other: TransferControlsRenderState): Boolean { + return other is InProgress && copy(progress = other.progress, label = other.label) == other + } + } data class Retry( val isUpload: Boolean