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