fix(android): tune screenshot mode visual sizing (#100895)

* fix(android): tune screenshot mode visual sizing

* chore(android): refresh screenshot i18n inventory

* refactor(android): simplify screenshot mode sizing

---------

Co-authored-by: IWhatsskill <284122573+IWhatsskill@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
This commit is contained in:
WhatsSkiLL 2026-07-07 03:01:02 +02:00 committed by GitHub
parent 775ef966c3
commit 4b3941c7f2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 65 additions and 51 deletions

View file

@ -443,7 +443,7 @@
},
{
"kind": "ui-named-argument",
"line": 67,
"line": 75,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/AndroidScreenshotModeScreen.kt",
"source": "OpenClaw",
"surface": "android",
@ -451,7 +451,7 @@
},
{
"kind": "ui-named-argument",
"line": 74,
"line": 82,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/AndroidScreenshotModeScreen.kt",
"source": "Connected",
"surface": "android",
@ -459,7 +459,7 @@
},
{
"kind": "ui-named-argument",
"line": 99,
"line": 107,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/AndroidScreenshotModeScreen.kt",
"source": "Gateway paired",
"surface": "android",
@ -467,7 +467,7 @@
},
{
"kind": "ui-named-argument",
"line": 99,
"line": 107,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/AndroidScreenshotModeScreen.kt",
"source": "Mac Studio - Tailnet",
"surface": "android",
@ -475,7 +475,7 @@
},
{
"kind": "ui-named-argument",
"line": 100,
"line": 108,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/AndroidScreenshotModeScreen.kt",
"source": "Node",
"surface": "android",
@ -483,7 +483,7 @@
},
{
"kind": "ui-named-argument",
"line": 101,
"line": 109,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/AndroidScreenshotModeScreen.kt",
"source": "Transport",
"surface": "android",
@ -491,7 +491,7 @@
},
{
"kind": "ui-named-argument",
"line": 102,
"line": 110,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/AndroidScreenshotModeScreen.kt",
"source": "Capabilities",
"surface": "android",
@ -499,7 +499,7 @@
},
{
"kind": "ui-named-argument",
"line": 105,
"line": 113,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/AndroidScreenshotModeScreen.kt",
"source": "Ready",
"surface": "android",
@ -507,7 +507,7 @@
},
{
"kind": "ui-named-argument",
"line": 117,
"line": 125,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/AndroidScreenshotModeScreen.kt",
"source": "Hi Molty, are you there?",
"surface": "android",
@ -515,7 +515,7 @@
},
{
"kind": "ui-named-argument",
"line": 117,
"line": 125,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/AndroidScreenshotModeScreen.kt",
"source": "You",
"surface": "android",
@ -523,7 +523,7 @@
},
{
"kind": "ui-named-argument",
"line": 119,
"line": 127,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/AndroidScreenshotModeScreen.kt",
"source": "Molty",
"surface": "android",
@ -531,7 +531,7 @@
},
{
"kind": "ui-named-argument",
"line": 120,
"line": 128,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/AndroidScreenshotModeScreen.kt",
"source": "Always. Lurking in the shadows, exfoliating.",
"surface": "android",
@ -539,7 +539,7 @@
},
{
"kind": "ui-named-argument",
"line": 144,
"line": 156,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/AndroidScreenshotModeScreen.kt",
"source": "Listening on device",
"surface": "android",
@ -547,7 +547,7 @@
},
{
"kind": "ui-named-argument",
"line": 144,
"line": 156,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/AndroidScreenshotModeScreen.kt",
"source": "Talk mode",
"surface": "android",
@ -555,7 +555,7 @@
},
{
"kind": "ui-named-argument",
"line": 145,
"line": 157,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/AndroidScreenshotModeScreen.kt",
"source": "Wake phrase",
"surface": "android",
@ -563,7 +563,7 @@
},
{
"kind": "ui-named-argument",
"line": 146,
"line": 158,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/AndroidScreenshotModeScreen.kt",
"source": "Latency",
"surface": "android",
@ -571,7 +571,7 @@
},
{
"kind": "ui-named-argument",
"line": 152,
"line": 164,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/AndroidScreenshotModeScreen.kt",
"source": "Screen tools",
"surface": "android",
@ -579,7 +579,7 @@
},
{
"kind": "ui-named-argument",
"line": 152,
"line": 164,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/AndroidScreenshotModeScreen.kt",
"source": "Shared with your gateway",
"surface": "android",
@ -587,7 +587,7 @@
},
{
"kind": "ui-named-argument",
"line": 153,
"line": 165,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/AndroidScreenshotModeScreen.kt",
"source": "Canvas",
"surface": "android",
@ -595,7 +595,7 @@
},
{
"kind": "ui-named-argument",
"line": 164,
"line": 176,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/AndroidScreenshotModeScreen.kt",
"source": "Live context",
"surface": "android",
@ -603,7 +603,7 @@
},
{
"kind": "ui-named-argument",
"line": 165,
"line": 177,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/AndroidScreenshotModeScreen.kt",
"source": "Camera",
"surface": "android",
@ -611,7 +611,7 @@
},
{
"kind": "ui-named-argument",
"line": 166,
"line": 178,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/AndroidScreenshotModeScreen.kt",
"source": "Screen",
"surface": "android",
@ -619,7 +619,7 @@
},
{
"kind": "ui-named-argument",
"line": 167,
"line": 179,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/AndroidScreenshotModeScreen.kt",
"source": "Location",
"surface": "android",
@ -627,7 +627,7 @@
},
{
"kind": "ui-named-argument",
"line": 175,
"line": 187,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/AndroidScreenshotModeScreen.kt",
"source": "Security",
"surface": "android",
@ -635,7 +635,7 @@
},
{
"kind": "ui-named-argument",
"line": 179,
"line": 191,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/AndroidScreenshotModeScreen.kt",
"source": "Notifications",
"surface": "android",
@ -643,7 +643,7 @@
},
{
"kind": "conditional-branch",
"line": 385,
"line": 397,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/AndroidScreenshotModeScreen.kt",
"source": "Connect",
"surface": "android",
@ -651,7 +651,7 @@
},
{
"kind": "conditional-branch",
"line": 386,
"line": 398,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/AndroidScreenshotModeScreen.kt",
"source": "Chat",
"surface": "android",
@ -659,7 +659,7 @@
},
{
"kind": "conditional-branch",
"line": 387,
"line": 399,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/AndroidScreenshotModeScreen.kt",
"source": "Talk",
"surface": "android",
@ -667,7 +667,7 @@
},
{
"kind": "conditional-branch",
"line": 388,
"line": 400,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/AndroidScreenshotModeScreen.kt",
"source": "Device tools",
"surface": "android",
@ -675,7 +675,7 @@
},
{
"kind": "conditional-branch",
"line": 389,
"line": 401,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/AndroidScreenshotModeScreen.kt",
"source": "Settings",
"surface": "android",

View file

@ -12,6 +12,8 @@ Assistant messages now offer a long-press Listen action with gateway TTS playbac
Android command-palette rows now align icon and navigation affordances consistently and truncate long session details cleanly. Thanks @IWhatsskill.
Android screenshot-mode voice and screen proof scenes now scale cleanly on compact capture widths. Thanks @IWhatsskill.
The Settings About screen now shows the animated mascot with the app tagline plus Website, Docs, GitHub, and Discord links.
Adds a read-only Files browser for agent workspaces with directory navigation, text and image previews, and system share export.

View file

@ -10,12 +10,15 @@ import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.aspectRatio
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.widthIn
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
@ -38,6 +41,8 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
private val ScreenshotIconBoxSize = 44.dp
@Composable
fun AndroidScreenshotModeScreen(scene: AndroidScreenshotScene) {
ClawDesignTheme(dark = true) {
@ -46,7 +51,10 @@ fun AndroidScreenshotModeScreen(scene: AndroidScreenshotScene) {
Modifier
.fillMaxSize()
.background(ClawTheme.colors.canvas)
.padding(horizontal = 20.dp, vertical = 26.dp),
.padding(
horizontal = ClawTheme.spacing.md,
vertical = 26.dp,
),
verticalArrangement = Arrangement.SpaceBetween,
) {
ScreenshotHeader(scene)
@ -81,7 +89,7 @@ private fun ScreenshotSceneBody(
modifier: Modifier = Modifier,
) {
Column(
modifier = modifier.fillMaxWidth().padding(vertical = 20.dp),
modifier = modifier.fillMaxWidth().padding(vertical = ClawTheme.spacing.md),
verticalArrangement = Arrangement.spacedBy(14.dp),
) {
when (scene) {
@ -124,9 +132,13 @@ private fun ChatScene() {
@Composable
private fun VoiceScene() {
Box(modifier = Modifier.fillMaxWidth().padding(vertical = 20.dp), contentAlignment = Alignment.Center) {
Box(
modifier = Modifier.fillMaxWidth().padding(vertical = ClawTheme.spacing.md),
contentAlignment = Alignment.Center,
) {
// Scale the proof orb with compact capture widths while preserving its 196dp design cap.
Surface(
modifier = Modifier.size(196.dp),
modifier = Modifier.widthIn(max = 196.dp).fillMaxWidth().aspectRatio(1f),
shape = CircleShape,
color = ClawTheme.colors.surfaceRaised,
border = BorderStroke(1.dp, ClawTheme.colors.borderStrong),
@ -136,7 +148,7 @@ private fun VoiceScene() {
imageVector = Icons.Default.Mic,
contentDescription = null,
tint = ClawTheme.colors.primary,
modifier = Modifier.size(72.dp),
modifier = Modifier.fillMaxSize(0.37f),
)
}
}
@ -155,12 +167,12 @@ private fun ScreenScene() {
MetricRow(label = "Location", value = "On request")
}
Surface(
modifier = Modifier.fillMaxWidth().height(168.dp),
shape = RoundedCornerShape(8.dp),
modifier = Modifier.fillMaxWidth().heightIn(min = 160.dp),
shape = RoundedCornerShape(ClawTheme.radii.button),
color = ClawTheme.colors.surfaceRaised,
border = BorderStroke(1.dp, ClawTheme.colors.border),
) {
Column(modifier = Modifier.padding(16.dp), verticalArrangement = Arrangement.spacedBy(10.dp)) {
Column(modifier = Modifier.padding(ClawTheme.spacing.sm), verticalArrangement = Arrangement.spacedBy(10.dp)) {
Text(text = "Live context", style = ClawTheme.type.section, color = ClawTheme.colors.text)
ContextBar(label = "Camera", fraction = 0.74f)
ContextBar(label = "Screen", fraction = 0.58f)
@ -190,11 +202,11 @@ private fun FeaturePanel(
) {
Surface(
modifier = Modifier.fillMaxWidth(),
shape = RoundedCornerShape(8.dp),
shape = RoundedCornerShape(ClawTheme.radii.button),
color = ClawTheme.colors.surface,
border = BorderStroke(1.dp, ClawTheme.colors.border),
) {
Column(modifier = Modifier.padding(16.dp), verticalArrangement = Arrangement.spacedBy(14.dp)) {
Column(modifier = Modifier.padding(ClawTheme.spacing.sm), verticalArrangement = Arrangement.spacedBy(14.dp)) {
Row(verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(12.dp)) {
IconBox(icon = icon)
Column {
@ -214,11 +226,11 @@ private fun CompactList(
) {
Surface(
modifier = Modifier.fillMaxWidth(),
shape = RoundedCornerShape(8.dp),
shape = RoundedCornerShape(ClawTheme.radii.button),
color = ClawTheme.colors.surfaceRaised,
border = BorderStroke(1.dp, ClawTheme.colors.border),
) {
Column(modifier = Modifier.padding(16.dp), verticalArrangement = Arrangement.spacedBy(12.dp)) {
Column(modifier = Modifier.padding(ClawTheme.spacing.sm), verticalArrangement = Arrangement.spacedBy(12.dp)) {
Text(text = title, style = ClawTheme.type.section, color = ClawTheme.colors.text)
rows.forEach { row ->
Row(verticalAlignment = Alignment.CenterVertically) {
@ -239,11 +251,11 @@ private fun ChatBubble(
) {
Surface(
modifier = Modifier.fillMaxWidth(),
shape = RoundedCornerShape(8.dp),
shape = RoundedCornerShape(ClawTheme.radii.button),
color = if (raised) ClawTheme.colors.surfaceRaised else ClawTheme.colors.surface,
border = BorderStroke(1.dp, if (raised) ClawTheme.colors.borderStrong else ClawTheme.colors.border),
) {
Column(modifier = Modifier.padding(16.dp), verticalArrangement = Arrangement.spacedBy(8.dp)) {
Column(modifier = Modifier.padding(ClawTheme.spacing.sm), verticalArrangement = Arrangement.spacedBy(8.dp)) {
Text(text = label, style = ClawTheme.type.caption, color = ClawTheme.colors.textSubtle)
Text(text = text, style = ClawTheme.type.body, color = ClawTheme.colors.text)
}
@ -279,7 +291,7 @@ private fun ContextBar(
Modifier
.fillMaxWidth()
.height(7.dp)
.clip(RoundedCornerShape(4.dp))
.clip(RoundedCornerShape(ClawTheme.radii.row))
.background(ClawTheme.colors.surfacePressed),
) {
Box(
@ -297,7 +309,7 @@ private fun ContextBar(
private fun ScreenshotTabBar(activeScene: AndroidScreenshotScene) {
Surface(
modifier = Modifier.fillMaxWidth(),
shape = RoundedCornerShape(8.dp),
shape = RoundedCornerShape(ClawTheme.radii.button),
color = ClawTheme.colors.surface,
border = BorderStroke(1.dp, ClawTheme.colors.border),
) {
@ -322,8 +334,8 @@ private fun TabIcon(
Box(
modifier =
Modifier
.size(42.dp)
.clip(RoundedCornerShape(6.dp))
.size(ScreenshotIconBoxSize)
.clip(RoundedCornerShape(ClawTheme.radii.control))
.background(if (active) ClawTheme.colors.surfacePressed else Color.Transparent),
contentAlignment = Alignment.Center,
) {
@ -341,8 +353,8 @@ private fun IconBox(icon: ImageVector) {
Box(
modifier =
Modifier
.size(42.dp)
.clip(RoundedCornerShape(8.dp))
.size(ScreenshotIconBoxSize)
.clip(RoundedCornerShape(ClawTheme.radii.button))
.background(ClawTheme.colors.surfacePressed),
contentAlignment = Alignment.Center,
) {
@ -361,7 +373,7 @@ private fun StatusPill(
color: Color,
) {
Surface(
shape = RoundedCornerShape(8.dp),
shape = RoundedCornerShape(ClawTheme.radii.button),
color = ClawTheme.colors.surfaceRaised,
border = BorderStroke(1.dp, ClawTheme.colors.border),
) {