android: fix PTT button — Box+pointerInput(hasMicPerm) instead of IconButton+onClick conflict
This commit is contained in:
1 parent
1f8f41bda7
commit
50214d50c1
1 file changed
+36
-34
+36
-34
@@ -185,47 +185,49 @@ fun InputBar(
|
||||
}
|
||||
} else {
|
||||
/* Idle: PTT + send */
|
||||
IconButton(
|
||||
onClick = {
|
||||
if (!hasMicPerm) { permLauncher.launch(Manifest.permission.RECORD_AUDIO); return@IconButton }
|
||||
},
|
||||
enabled = true,
|
||||
modifier = Modifier.pointerInput(Unit) {
|
||||
awaitPointerEventScope {
|
||||
/* wait for the first down */
|
||||
var event = awaitPointerEvent()
|
||||
var change = event.changes.firstOrNull() ?: return@awaitPointerEventScope
|
||||
if (!change.pressed) return@awaitPointerEventScope
|
||||
change.consume()
|
||||
Box(
|
||||
modifier = Modifier
|
||||
.size(48.dp)
|
||||
.pointerInput(hasMicPerm) {
|
||||
awaitPointerEventScope {
|
||||
val down = awaitPointerEvent()
|
||||
val ch = down.changes.firstOrNull() ?: return@awaitPointerEventScope
|
||||
if (!ch.pressed) return@awaitPointerEventScope
|
||||
ch.consume()
|
||||
|
||||
if (!hasMicPerm) return@awaitPointerEventScope
|
||||
onPttPressed()
|
||||
var locked = false
|
||||
var totalDragY = 0f
|
||||
var lastY = change.position.y
|
||||
|
||||
while (true) {
|
||||
event = awaitPointerEvent()
|
||||
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()
|
||||
}
|
||||
change.consume()
|
||||
} else {
|
||||
change.consume(); break
|
||||
if (!hasMicPerm) {
|
||||
permLauncher.launch(Manifest.permission.RECORD_AUDIO)
|
||||
return@awaitPointerEventScope
|
||||
}
|
||||
|
||||
onPttPressed()
|
||||
var locked = false
|
||||
var totalDragY = 0f
|
||||
var lastY = ch.position.y
|
||||
|
||||
while (true) {
|
||||
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() }
|
||||
change.consume()
|
||||
} else {
|
||||
change.consume(); break
|
||||
}
|
||||
}
|
||||
onPttReleased()
|
||||
}
|
||||
onPttReleased()
|
||||
}
|
||||
}
|
||||
},
|
||||
contentAlignment = Alignment.Center
|
||||
) {
|
||||
Text("\uD83C\uDFA4", fontSize = 20.sp)
|
||||
}
|
||||
|
||||
Spacer(Modifier.width(4.dp))
|
||||
|
||||
Button(onClick = onSend, enabled = enabled && text.isNotBlank()) {
|
||||
Text("Send")
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user