From afebbf6acb85eb6c7cfc7cf73ebd2c21a2a34882 Mon Sep 17 00:00:00 2001 From: k1ngsterr1 Date: Sun, 12 Apr 2026 00:08:33 +0500 Subject: [PATCH] =?UTF-8?q?fix:=20slide-to-cancel=20=D0=BD=D0=B5=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D0=B5=D1=82=20=D0=BF=D1=80=D0=B8?= =?UTF-8?q?=20LOCKED/PAUSED=20=E2=80=94=20=D0=BA=D0=B0=D0=BA=20=D0=B2=20Te?= =?UTF-8?q?legram?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Telegram: при sendButtonVisible=true gesture handler возвращает false, полностью блокируя горизонтальный свайп. Slide-to-cancel исчезает, вместо него кнопка Cancel. Изменения: - Gesture handler: только RECORDING обрабатывает slide (было RECORDING||LOCKED) - slideDx/slideDy не обновляются при LOCKED/PAUSED - При lock: slideDx=0, slideDy=0 — сбрасываем горизонтальное смещение - AnimatedContent уже переключает SlideToCancel→waveform при LOCKED Co-Authored-By: Claude Opus 4.6 (1M context) --- .../ui/chats/input/ChatDetailInput.kt | 43 +++++++++---------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/com/rosetta/messenger/ui/chats/input/ChatDetailInput.kt b/app/src/main/java/com/rosetta/messenger/ui/chats/input/ChatDetailInput.kt index b219512..c31b1eb 100644 --- a/app/src/main/java/com/rosetta/messenger/ui/chats/input/ChatDetailInput.kt +++ b/app/src/main/java/com/rosetta/messenger/ui/chats/input/ChatDetailInput.kt @@ -2513,33 +2513,32 @@ fun MessageInputBar( val absDy = kotlin.math.abs(dy) if (absDx > maxAbsDx) maxAbsDx = absDx if (absDy > maxAbsDy) maxAbsDy = absDy - } else if ( - recordUiState == RecordUiState.RECORDING || - recordUiState == RecordUiState.LOCKED - ) { + } else if (recordUiState == RecordUiState.RECORDING) { + // Only RECORDING processes slide gestures + // LOCKED/PAUSED: no gesture processing (Telegram: return false) val dx = change.position.x - pressStartX val dy = change.position.y - pressStartY slideDx = dx slideDy = dy + lockProgress = ((-dy) / lockDragThresholdPx).coerceIn(0f, 1f) - if (recordUiState == RecordUiState.RECORDING) { - lockProgress = ((-dy) / lockDragThresholdPx).coerceIn(0f, 1f) - if (dx <= -cancelDragThresholdPx) { - inputJumpLog( - "gesture CANCEL dx=${dx.toInt()} threshold=${cancelDragThresholdPx.toInt()} mode=$recordMode" - ) - stopVoiceRecording(send = false) - setRecordUiState(RecordUiState.IDLE, "slide-cancel") - resetGestureState() - finished = true - } else if (dy <= -lockDragThresholdPx) { - view.performHapticFeedback(android.view.HapticFeedbackConstants.KEYBOARD_TAP) - lockProgress = 1f - setRecordUiState( - RecordUiState.LOCKED, - "slide-lock dy=${dy.toInt()}" - ) - } + if (dx <= -cancelDragThresholdPx) { + inputJumpLog( + "gesture CANCEL dx=${dx.toInt()} threshold=${cancelDragThresholdPx.toInt()} mode=$recordMode" + ) + stopVoiceRecording(send = false) + setRecordUiState(RecordUiState.IDLE, "slide-cancel") + resetGestureState() + finished = true + } else if (dy <= -lockDragThresholdPx) { + view.performHapticFeedback(android.view.HapticFeedbackConstants.KEYBOARD_TAP) + lockProgress = 1f + slideDx = 0f // reset horizontal slide on lock + slideDy = 0f + setRecordUiState( + RecordUiState.LOCKED, + "slide-lock dy=${dy.toInt()}" + ) } } change.consume()