Browse Source

android: fix PTT button — Box+pointerInput(hasMicPerm) instead of IconButton+onClick conflict

topo_upd
evgeny 2 months ago
parent
commit
50214d50c1
  1. 70
      tools/chatgui-android/app/src/main/java/com/utun/chat/ui/components/MessageBubble.kt

70
tools/chatgui-android/app/src/main/java/com/utun/chat/ui/components/MessageBubble.kt

@ -185,47 +185,49 @@ fun InputBar(
} }
} else { } else {
/* Idle: PTT + send */ /* Idle: PTT + send */
IconButton( Box(
onClick = { modifier = Modifier
if (!hasMicPerm) { permLauncher.launch(Manifest.permission.RECORD_AUDIO); return@IconButton } .size(48.dp)
}, .pointerInput(hasMicPerm) {
enabled = true, awaitPointerEventScope {
modifier = Modifier.pointerInput(Unit) { val down = awaitPointerEvent()
awaitPointerEventScope { val ch = down.changes.firstOrNull() ?: return@awaitPointerEventScope
/* wait for the first down */ if (!ch.pressed) return@awaitPointerEventScope
var event = awaitPointerEvent() ch.consume()
var change = event.changes.firstOrNull() ?: return@awaitPointerEventScope
if (!change.pressed) return@awaitPointerEventScope if (!hasMicPerm) {
change.consume() permLauncher.launch(Manifest.permission.RECORD_AUDIO)
return@awaitPointerEventScope
if (!hasMicPerm) return@awaitPointerEventScope }
onPttPressed()
var locked = false onPttPressed()
var totalDragY = 0f var locked = false
var lastY = change.position.y var totalDragY = 0f
var lastY = ch.position.y
while (true) {
event = awaitPointerEvent() while (true) {
change = event.changes.firstOrNull() ?: break val event = awaitPointerEvent()
if (change.pressed) { val change = event.changes.firstOrNull() ?: break
val dy = change.position.y - lastY if (change.pressed) {
lastY = change.position.y val dy = change.position.y - lastY
totalDragY += dy lastY = change.position.y
if (totalDragY < -lockThresholdPx && !locked) { totalDragY += dy
locked = true; onPttLock() if (totalDragY < -lockThresholdPx && !locked) { locked = true; onPttLock() }
change.consume()
} else {
change.consume(); break
} }
change.consume()
} else {
change.consume(); break
} }
onPttReleased()
} }
onPttReleased() },
} contentAlignment = Alignment.Center
}
) { ) {
Text("\uD83C\uDFA4", fontSize = 20.sp) Text("\uD83C\uDFA4", fontSize = 20.sp)
} }
Spacer(Modifier.width(4.dp))
Button(onClick = onSend, enabled = enabled && text.isNotBlank()) { Button(onClick = onSend, enabled = enabled && text.isNotBlank()) {
Text("Send") Text("Send")
} }

Loading…
Cancel
Save