diff --git a/apps/.i18n/native-source.json b/apps/.i18n/native-source.json index 042412333c70..b5e6f7cda6c6 100644 --- a/apps/.i18n/native-source.json +++ b/apps/.i18n/native-source.json @@ -4787,7 +4787,7 @@ }, { "kind": "ui-named-argument", - "line": 382, + "line": 387, "path": "apps/android/app/src/main/java/ai/openclaw/app/ui/VoiceScreen.kt", "source": "Tip: stop listening to send the captured turn.", "surface": "android", @@ -4795,7 +4795,7 @@ }, { "kind": "ui-named-argument", - "line": 386, + "line": 397, "path": "apps/android/app/src/main/java/ai/openclaw/app/ui/VoiceScreen.kt", "source": "Cancel", "surface": "android", @@ -4803,7 +4803,7 @@ }, { "kind": "conditional-branch", - "line": 387, + "line": 398, "path": "apps/android/app/src/main/java/ai/openclaw/app/ui/VoiceScreen.kt", "source": "Send to Chat", "surface": "android", @@ -4811,7 +4811,7 @@ }, { "kind": "ui-named-argument", - "line": 427, + "line": 438, "path": "apps/android/app/src/main/java/ai/openclaw/app/ui/VoiceScreen.kt", "source": "Back to voice", "surface": "android", @@ -4819,7 +4819,7 @@ }, { "kind": "ui-named-argument", - "line": 429, + "line": 440, "path": "apps/android/app/src/main/java/ai/openclaw/app/ui/VoiceScreen.kt", "source": "Realtime Talk", "surface": "android", @@ -4827,7 +4827,7 @@ }, { "kind": "ui-named-argument", - "line": 446, + "line": 457, "path": "apps/android/app/src/main/java/ai/openclaw/app/ui/VoiceScreen.kt", "source": "Talk settings", "surface": "android", @@ -4835,7 +4835,7 @@ }, { "kind": "conditional-branch", - "line": 470, + "line": 483, "path": "apps/android/app/src/main/java/ai/openclaw/app/ui/VoiceScreen.kt", "source": "Mute", "surface": "android", @@ -4843,7 +4843,7 @@ }, { "kind": "conditional-branch", - "line": 470, + "line": 483, "path": "apps/android/app/src/main/java/ai/openclaw/app/ui/VoiceScreen.kt", "source": "Unmute", "surface": "android", @@ -4851,7 +4851,7 @@ }, { "kind": "ui-named-argument", - "line": 471, + "line": 489, "path": "apps/android/app/src/main/java/ai/openclaw/app/ui/VoiceScreen.kt", "source": "End", "surface": "android", @@ -4859,7 +4859,7 @@ }, { "kind": "ui-named-argument", - "line": 485, + "line": 512, "path": "apps/android/app/src/main/java/ai/openclaw/app/ui/VoiceScreen.kt", "source": "Listening for your next turn.", "surface": "android", @@ -4867,7 +4867,7 @@ }, { "kind": "ui-named-argument", - "line": 572, + "line": 612, "path": "apps/android/app/src/main/java/ai/openclaw/app/ui/VoiceScreen.kt", "source": "OpenClaw", "surface": "android", @@ -4875,7 +4875,7 @@ }, { "kind": "ui-named-argument", - "line": 577, + "line": 617, "path": "apps/android/app/src/main/java/ai/openclaw/app/ui/VoiceScreen.kt", "source": "Search voice", "surface": "android", @@ -4883,7 +4883,7 @@ }, { "kind": "ui-named-argument", - "line": 585, + "line": 625, "path": "apps/android/app/src/main/java/ai/openclaw/app/ui/VoiceScreen.kt", "source": "Voice", "surface": "android", @@ -4891,7 +4891,7 @@ }, { "kind": "conditional-branch", - "line": 596, + "line": 636, "path": "apps/android/app/src/main/java/ai/openclaw/app/ui/VoiceScreen.kt", "source": "Mute speaker", "surface": "android", @@ -4899,7 +4899,7 @@ }, { "kind": "conditional-branch", - "line": 596, + "line": 636, "path": "apps/android/app/src/main/java/ai/openclaw/app/ui/VoiceScreen.kt", "source": "Unmute speaker", "surface": "android", @@ -4907,7 +4907,7 @@ }, { "kind": "conditional-branch", - "line": 679, + "line": 719, "path": "apps/android/app/src/main/java/ai/openclaw/app/ui/VoiceScreen.kt", "source": "End Talk", "surface": "android", @@ -4915,7 +4915,7 @@ }, { "kind": "conditional-branch", - "line": 691, + "line": 731, "path": "apps/android/app/src/main/java/ai/openclaw/app/ui/VoiceScreen.kt", "source": "Stop Dictation", "surface": "android", @@ -4923,7 +4923,7 @@ }, { "kind": "ui-named-argument", - "line": 828, + "line": 868, "path": "apps/android/app/src/main/java/ai/openclaw/app/ui/VoiceScreen.kt", "source": "Voice setup", "surface": "android", @@ -4931,7 +4931,7 @@ }, { "kind": "ui-named-argument", - "line": 991, + "line": 1038, "path": "apps/android/app/src/main/java/ai/openclaw/app/ui/VoiceScreen.kt", "source": "Live transcript", "surface": "android", @@ -4939,7 +4939,7 @@ }, { "kind": "ui-named-argument", - "line": 994, + "line": 1041, "path": "apps/android/app/src/main/java/ai/openclaw/app/ui/VoiceScreen.kt", "source": "No transcript yet", "surface": "android", @@ -4947,7 +4947,7 @@ }, { "kind": "ui-named-argument", - "line": 996, + "line": 1043, "path": "apps/android/app/src/main/java/ai/openclaw/app/ui/VoiceScreen.kt", "source": "Your words and OpenClaw replies will appear here.", "surface": "android", @@ -4955,7 +4955,7 @@ }, { "kind": "conditional-branch", - "line": 1021, + "line": 1068, "path": "apps/android/app/src/main/java/ai/openclaw/app/ui/VoiceScreen.kt", "source": "You", "surface": "android", @@ -4963,7 +4963,7 @@ }, { "kind": "ui-named-argument", - "line": 1039, + "line": 1086, "path": "apps/android/app/src/main/java/ai/openclaw/app/ui/VoiceScreen.kt", "source": "Sending", "surface": "android", @@ -4971,7 +4971,7 @@ }, { "kind": "ui-named-argument", - "line": 1040, + "line": 1088, "path": "apps/android/app/src/main/java/ai/openclaw/app/ui/VoiceScreen.kt", "source": "OpenClaw is preparing a response.", "surface": "android", @@ -4979,7 +4979,7 @@ }, { "kind": "ui-named-argument", - "line": 1049, + "line": 1103, "path": "apps/android/app/src/main/java/ai/openclaw/app/ui/VoiceScreen.kt", "source": "Permission needed", "surface": "android", @@ -4987,7 +4987,7 @@ }, { "kind": "ui-named-argument", - "line": 1050, + "line": 1104, "path": "apps/android/app/src/main/java/ai/openclaw/app/ui/VoiceScreen.kt", "source": "Microphone access is needed.", "surface": "android", @@ -4995,7 +4995,7 @@ }, { "kind": "ui-named-argument", - "line": 1052, + "line": 1106, "path": "apps/android/app/src/main/java/ai/openclaw/app/ui/VoiceScreen.kt", "source": "OpenClaw only listens when you start Talk or Dictation.", "surface": "android", @@ -5003,7 +5003,7 @@ }, { "kind": "ui-named-argument", - "line": 1056, + "line": 1110, "path": "apps/android/app/src/main/java/ai/openclaw/app/ui/VoiceScreen.kt", "source": "Enable Microphone", "surface": "android", diff --git a/apps/android/app/src/main/java/ai/openclaw/app/ui/VoiceScreen.kt b/apps/android/app/src/main/java/ai/openclaw/app/ui/VoiceScreen.kt index d66e69342b6b..329040fab24f 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/ui/VoiceScreen.kt +++ b/apps/android/app/src/main/java/ai/openclaw/app/ui/VoiceScreen.kt @@ -377,9 +377,20 @@ private fun DictationScreen( } } - Row(verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(10.dp)) { + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(10.dp), + ) { Icon(imageVector = Icons.Default.Info, contentDescription = null, modifier = Modifier.size(16.dp), tint = ClawTheme.colors.textMuted) - Text(text = "Tip: stop listening to send the captured turn.", style = ClawTheme.type.caption, color = ClawTheme.colors.textMuted) + Text( + text = "Tip: stop listening to send the captured turn.", + modifier = Modifier.weight(1f), + style = ClawTheme.type.caption, + color = ClawTheme.colors.textMuted, + maxLines = 2, + overflow = TextOverflow.Ellipsis, + ) } Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(12.dp)) { @@ -464,12 +475,28 @@ private fun TalkSessionScreen( Row( modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.SpaceEvenly, + horizontalArrangement = Arrangement.spacedBy(12.dp), verticalAlignment = Alignment.CenterVertically, ) { - TalkControl(icon = if (speakerEnabled) Icons.AutoMirrored.Filled.VolumeUp else Icons.AutoMirrored.Filled.VolumeOff, label = if (speakerEnabled) "Mute" else "Unmute", onClick = onToggleSpeaker) - TalkControl(icon = Icons.Default.PhoneDisabled, label = "End", primary = true, onClick = onEndTalk) - TalkControl(icon = Icons.Default.GraphicEq, label = "Voice", onClick = onOpenVoiceSettings) + TalkControl( + icon = if (speakerEnabled) Icons.AutoMirrored.Filled.VolumeUp else Icons.AutoMirrored.Filled.VolumeOff, + label = if (speakerEnabled) "Mute" else "Unmute", + modifier = Modifier.weight(1f), + onClick = onToggleSpeaker, + ) + TalkControl( + icon = Icons.Default.PhoneDisabled, + label = "End", + primary = true, + modifier = Modifier.weight(1f), + onClick = onEndTalk, + ) + TalkControl( + icon = Icons.Default.GraphicEq, + label = "Voice", + modifier = Modifier.weight(1f), + onClick = onOpenVoiceSettings, + ) } } } @@ -520,9 +547,14 @@ private fun TalkControl( icon: androidx.compose.ui.graphics.vector.ImageVector, label: String, primary: Boolean = false, + modifier: Modifier = Modifier, onClick: () -> Unit, ) { - Column(horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.spacedBy(5.dp)) { + Column( + modifier = modifier, + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(5.dp), + ) { Surface( onClick = onClick, modifier = Modifier.size(ClawTheme.spacing.touchTarget), @@ -535,7 +567,15 @@ private fun TalkControl( Icon(imageVector = icon, contentDescription = label, modifier = Modifier.size(if (primary) 20.dp else 18.dp)) } } - Text(text = label, style = ClawTheme.type.caption.copy(fontSize = 12.5.sp, lineHeight = 16.sp), color = ClawTheme.colors.textMuted) + Text( + text = label, + modifier = Modifier.fillMaxWidth(), + style = ClawTheme.type.caption.copy(fontSize = 12.5.sp, lineHeight = 16.sp), + color = ClawTheme.colors.textMuted, + textAlign = TextAlign.Center, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) } } @@ -742,7 +782,7 @@ private fun VoiceModeRow( ) { Surface(onClick = onClick, enabled = enabled, color = Color.Transparent, contentColor = ClawTheme.colors.text) { Row( - modifier = Modifier.fillMaxWidth().heightIn(min = 54.dp).padding(horizontal = 0.dp, vertical = 7.dp), + modifier = Modifier.fillMaxWidth().heightIn(min = 58.dp).padding(horizontal = 0.dp, vertical = 8.dp), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(10.dp), ) { @@ -767,9 +807,9 @@ private fun VoiceModeRow( ) Text( text = subtitle, - style = ClawTheme.type.caption, + style = ClawTheme.type.caption.copy(lineHeight = 16.sp), color = ClawTheme.colors.textMuted, - maxLines = 1, + maxLines = 2, overflow = TextOverflow.Ellipsis, ) } @@ -866,6 +906,7 @@ private fun VoiceProviderCard( style = ClawTheme.type.caption, color = ClawTheme.colors.textMuted, maxLines = 1, + overflow = TextOverflow.Ellipsis, ) } } @@ -897,12 +938,18 @@ private fun VoicePrimaryAction( contentColor = ClawTheme.colors.primaryText, ) { Row( - modifier = Modifier.fillMaxSize(), + modifier = Modifier.fillMaxSize().padding(horizontal = 14.dp), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.Center, ) { Icon(imageVector = icon, contentDescription = null, modifier = Modifier.size(17.dp)) - Text(text = text, modifier = Modifier.padding(start = 8.dp), style = ClawTheme.type.label) + Text( + text = text, + modifier = Modifier.padding(start = 8.dp), + style = ClawTheme.type.label, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) } } } @@ -1037,7 +1084,14 @@ private fun VoiceThinkingCard() { ClawPanel { Row(verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(10.dp)) { ClawStatusPill(text = "Sending", status = ClawStatus.Warning) - Text(text = "OpenClaw is preparing a response.", style = ClawTheme.type.body, color = ClawTheme.colors.textMuted) + Text( + text = "OpenClaw is preparing a response.", + modifier = Modifier.weight(1f), + style = ClawTheme.type.body, + color = ClawTheme.colors.textMuted, + maxLines = 2, + overflow = TextOverflow.Ellipsis, + ) } } }