diff --git a/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/components/MessageBubble.kt b/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/components/MessageBubble.kt index e81b0a9b..44b9873e 100644 --- a/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/components/MessageBubble.kt +++ b/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/components/MessageBubble.kt @@ -167,27 +167,20 @@ fun InputBar( Spacer(Modifier.width(4.dp)) if (isRecording && isRecordingLocked) { - /* Locked: cancel + send voice */ + /* Locked: cancel + send voice — PTT box replaced by action buttons */ IconButton(onClick = onVoiceCancel) { Text("\u2715", fontSize = 20.sp, color = Color(0xFFE53935)) } IconButton(onClick = onVoiceSend) { Text("\u25B6", fontSize = 20.sp, color = Color(0xFF4CAF50)) } - } else if (isRecording) { - /* Holding: only PTT active */ - IconButton( - onClick = {}, - enabled = true, - modifier = Modifier.background(Color(0xFFE53935), RoundedCornerShape(4.dp)) - ) { - Text("\uD83C\uDFA4", fontSize = 20.sp) - } } else { - /* Idle: PTT + send */ + /* PTT Box — always present (same identity), just changes appearance */ + val pttBg = if (isRecording) Color(0xFFE53935) else Color.Transparent Box( modifier = Modifier .size(48.dp) + .background(pttBg, RoundedCornerShape(4.dp)) .pointerInput(hasMicPerm) { awaitPointerEventScope { val down = awaitPointerEvent() @@ -223,13 +216,14 @@ fun InputBar( }, contentAlignment = Alignment.Center ) { - Text("\uD83C\uDFA4", fontSize = 20.sp) + Text("\uD83C\uDFA4", fontSize = 20.sp, color = if (isRecording) Color.White else Color.Unspecified) } - Spacer(Modifier.width(4.dp)) - - Button(onClick = onSend, enabled = enabled && text.isNotBlank()) { - Text("Send") + if (!isRecording) { + Spacer(Modifier.width(4.dp)) + Button(onClick = onSend, enabled = enabled && text.isNotBlank()) { + Text("Send") + } } } } diff --git a/tools/chatgui-android/app/src/main/java/com/utun/chat/viewmodel/ChatViewModel.kt b/tools/chatgui-android/app/src/main/java/com/utun/chat/viewmodel/ChatViewModel.kt index 653c7f48..d06d6bc2 100644 --- a/tools/chatgui-android/app/src/main/java/com/utun/chat/viewmodel/ChatViewModel.kt +++ b/tools/chatgui-android/app/src/main/java/com/utun/chat/viewmodel/ChatViewModel.kt @@ -239,7 +239,7 @@ class ChatViewModel : ViewModel() { fun sendVoiceMessage() { val duration = stopVoiceRecording() - if (duration < 500) { + if (duration < 1000) { LogManager.addLog("INFO", "VM", "voice too short (${duration}ms), discarded") } } diff --git a/tools/chatgui-android/libutun_lite/voice_recorder.c b/tools/chatgui-android/libutun_lite/voice_recorder.c index fc12038d..1073c04f 100644 --- a/tools/chatgui-android/libutun_lite/voice_recorder.c +++ b/tools/chatgui-android/libutun_lite/voice_recorder.c @@ -221,7 +221,7 @@ int voice_recorder_stop(int* out_duration_ms) { return -1; } - if (elapsed_ms < 500) { + if (elapsed_ms < 1000) { DEBUG_INFO(DEBUG_CATEGORY_GENERAL, "voice_recorder_stop: too short %lldms, discarding", (long long)elapsed_ms); voice_cleanup_locked(g_rec); pthread_mutex_unlock(&g_rec->mtx);