fix: slide-to-cancel не работает при LOCKED/PAUSED — как в Telegram

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) <noreply@anthropic.com>
This commit is contained in:
2026-04-12 00:08:33 +05:00
parent aa3cc76646
commit afebbf6acb

View File

@@ -2513,33 +2513,32 @@ fun MessageInputBar(
val absDy = kotlin.math.abs(dy) val absDy = kotlin.math.abs(dy)
if (absDx > maxAbsDx) maxAbsDx = absDx if (absDx > maxAbsDx) maxAbsDx = absDx
if (absDy > maxAbsDy) maxAbsDy = absDy if (absDy > maxAbsDy) maxAbsDy = absDy
} else if ( } else if (recordUiState == RecordUiState.RECORDING) {
recordUiState == RecordUiState.RECORDING || // Only RECORDING processes slide gestures
recordUiState == RecordUiState.LOCKED // LOCKED/PAUSED: no gesture processing (Telegram: return false)
) {
val dx = change.position.x - pressStartX val dx = change.position.x - pressStartX
val dy = change.position.y - pressStartY val dy = change.position.y - pressStartY
slideDx = dx slideDx = dx
slideDy = dy slideDy = dy
lockProgress = ((-dy) / lockDragThresholdPx).coerceIn(0f, 1f)
if (recordUiState == RecordUiState.RECORDING) { if (dx <= -cancelDragThresholdPx) {
lockProgress = ((-dy) / lockDragThresholdPx).coerceIn(0f, 1f) inputJumpLog(
if (dx <= -cancelDragThresholdPx) { "gesture CANCEL dx=${dx.toInt()} threshold=${cancelDragThresholdPx.toInt()} mode=$recordMode"
inputJumpLog( )
"gesture CANCEL dx=${dx.toInt()} threshold=${cancelDragThresholdPx.toInt()} mode=$recordMode" stopVoiceRecording(send = false)
) setRecordUiState(RecordUiState.IDLE, "slide-cancel")
stopVoiceRecording(send = false) resetGestureState()
setRecordUiState(RecordUiState.IDLE, "slide-cancel") finished = true
resetGestureState() } else if (dy <= -lockDragThresholdPx) {
finished = true view.performHapticFeedback(android.view.HapticFeedbackConstants.KEYBOARD_TAP)
} else if (dy <= -lockDragThresholdPx) { lockProgress = 1f
view.performHapticFeedback(android.view.HapticFeedbackConstants.KEYBOARD_TAP) slideDx = 0f // reset horizontal slide on lock
lockProgress = 1f slideDy = 0f
setRecordUiState( setRecordUiState(
RecordUiState.LOCKED, RecordUiState.LOCKED,
"slide-lock dy=${dy.toInt()}" "slide-lock dy=${dy.toInt()}"
) )
}
} }
} }
change.consume() change.consume()