Browse Source

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

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

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

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

Loading…
Cancel
Save