style(android): apply ktlint to landed changes (#100304)

* style(android): apply current ktlint fixes

* style(android): format current app sources

* style(android): refresh native i18n inventory
This commit is contained in:
Peter Steinberger 2026-07-06 18:26:47 +01:00 committed by GitHub
parent a45c0999ce
commit f8307bb44c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
15 changed files with 371 additions and 175 deletions

View file

@ -3,7 +3,7 @@
"entries": [
{
"kind": "conditional-branch",
"line": 218,
"line": 217,
"path": "apps/android/app/src/main/java/ai/openclaw/app/CronJobDetail.kt",
"source": "Off",
"surface": "android",
@ -11,7 +11,7 @@
},
{
"kind": "conditional-branch",
"line": 219,
"line": 218,
"path": "apps/android/app/src/main/java/ai/openclaw/app/CronJobDetail.kt",
"source": "Default",
"surface": "android",
@ -1795,7 +1795,7 @@
},
{
"kind": "ui-call",
"line": 693,
"line": 694,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Trust",
"surface": "android",
@ -1803,7 +1803,7 @@
},
{
"kind": "ui-call",
"line": 698,
"line": 699,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Cancel",
"surface": "android",
@ -1811,7 +1811,7 @@
},
{
"kind": "ui-named-argument",
"line": 889,
"line": 890,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Welcome to OpenClaw",
"surface": "android",
@ -1819,7 +1819,7 @@
},
{
"kind": "ui-named-argument",
"line": 890,
"line": 891,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Turn this device into a secure OpenClaw node for chat, voice, camera, and device tools.",
"surface": "android",
@ -1827,7 +1827,7 @@
},
{
"kind": "ui-named-argument",
"line": 915,
"line": 916,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "OpenClaw logo",
"surface": "android",
@ -1835,7 +1835,7 @@
},
{
"kind": "ui-named-argument",
"line": 971,
"line": 972,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Connect to your Gateway",
"surface": "android",
@ -1843,7 +1843,7 @@
},
{
"kind": "ui-named-argument",
"line": 972,
"line": 973,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Choose device permissions",
"surface": "android",
@ -1851,7 +1851,7 @@
},
{
"kind": "ui-named-argument",
"line": 973,
"line": 974,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Use OpenClaw from your phone",
"surface": "android",
@ -1859,7 +1859,7 @@
},
{
"kind": "ui-named-argument",
"line": 995,
"line": 996,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Security notice",
"surface": "android",
@ -1867,7 +1867,7 @@
},
{
"kind": "ui-named-argument",
"line": 997,
"line": 998,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "The connected OpenClaw agent can use device capabilities you enable. Continue only if you trust the Gateway and agent you connect to.",
"surface": "android",
@ -1875,7 +1875,7 @@
},
{
"kind": "ui-named-argument",
"line": 1038,
"line": 1039,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Connect Gateway",
"surface": "android",
@ -1883,7 +1883,7 @@
},
{
"kind": "ui-named-argument",
"line": 1039,
"line": 1040,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Scan a QR code or use the setup code from your OpenClaw Gateway.",
"surface": "android",
@ -1891,7 +1891,7 @@
},
{
"kind": "ui-toast",
"line": 1048,
"line": 1049,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Could not open setup guide.",
"surface": "android",
@ -1899,7 +1899,7 @@
},
{
"kind": "ui-named-argument",
"line": 1056,
"line": 1057,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Scan QR or setup code",
"surface": "android",
@ -1907,7 +1907,7 @@
},
{
"kind": "ui-named-argument",
"line": 1062,
"line": 1063,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Set up manually",
"surface": "android",
@ -1915,7 +1915,7 @@
},
{
"kind": "ui-named-argument",
"line": 1084,
"line": 1085,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Before you start",
"surface": "android",
@ -1923,7 +1923,7 @@
},
{
"kind": "ui-named-argument",
"line": 1090,
"line": 1091,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Access to the Gateway device",
"surface": "android",
@ -1931,7 +1931,7 @@
},
{
"kind": "ui-named-argument",
"line": 1091,
"line": 1092,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Have a terminal open on the device running OpenClaw.",
"surface": "android",
@ -1939,7 +1939,7 @@
},
{
"kind": "ui-named-argument",
"line": 1094,
"line": 1095,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Phone can reach the Gateway",
"surface": "android",
@ -1947,7 +1947,7 @@
},
{
"kind": "ui-named-argument",
"line": 1095,
"line": 1096,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Use the same network, or a secure remote Gateway URL.",
"surface": "android",
@ -1955,7 +1955,7 @@
},
{
"kind": "ui-named-argument",
"line": 1101,
"line": 1102,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Android setup guide",
"surface": "android",
@ -1963,7 +1963,7 @@
},
{
"kind": "ui-named-argument",
"line": 1144,
"line": 1145,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Setup Gateway",
"surface": "android",
@ -1971,7 +1971,7 @@
},
{
"kind": "ui-named-argument",
"line": 1150,
"line": 1151,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Start your Gateway.",
"surface": "android",
@ -1979,7 +1979,7 @@
},
{
"kind": "ui-named-argument",
"line": 1151,
"line": 1152,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "openclaw gateway",
"surface": "android",
@ -1987,7 +1987,7 @@
},
{
"kind": "ui-named-argument",
"line": 1156,
"line": 1157,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Generate a QR code.",
"surface": "android",
@ -1995,7 +1995,7 @@
},
{
"kind": "ui-named-argument",
"line": 1157,
"line": 1158,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "openclaw qr",
"surface": "android",
@ -2003,7 +2003,7 @@
},
{
"kind": "ui-named-argument",
"line": 1177,
"line": 1178,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Choose from gallery",
"surface": "android",
@ -2011,7 +2011,7 @@
},
{
"kind": "ui-named-argument",
"line": 1231,
"line": 1232,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "QR code not accepted",
"surface": "android",
@ -2019,7 +2019,7 @@
},
{
"kind": "ui-named-argument",
"line": 1246,
"line": 1247,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Choose another image",
"surface": "android",
@ -2027,7 +2027,7 @@
},
{
"kind": "ui-named-argument",
"line": 1299,
"line": 1300,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Scan QR code",
"surface": "android",
@ -2035,7 +2035,7 @@
},
{
"kind": "ui-named-argument",
"line": 1301,
"line": 1302,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Open the camera and frame the code from openclaw qr.",
"surface": "android",
@ -2043,7 +2043,7 @@
},
{
"kind": "ui-named-argument",
"line": 1335,
"line": 1336,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Align the QR code inside the square.",
"surface": "android",
@ -2051,7 +2051,7 @@
},
{
"kind": "ui-named-argument",
"line": 1353,
"line": 1354,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Camera access is needed to scan the setup QR.",
"surface": "android",
@ -2059,7 +2059,7 @@
},
{
"kind": "ui-named-argument",
"line": 1358,
"line": 1359,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Allow camera",
"surface": "android",
@ -2067,7 +2067,7 @@
},
{
"kind": "ui-named-argument",
"line": 1379,
"line": 1380,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Close scanner",
"surface": "android",
@ -2075,7 +2075,7 @@
},
{
"kind": "ui-named-argument",
"line": 1541,
"line": 1542,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Enter setup code",
"surface": "android",
@ -2083,7 +2083,7 @@
},
{
"kind": "ui-named-argument",
"line": 1542,
"line": 1543,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Setup code",
"surface": "android",
@ -2091,7 +2091,7 @@
},
{
"kind": "ui-named-argument",
"line": 1546,
"line": 1547,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Paste setup code",
"surface": "android",
@ -2099,7 +2099,7 @@
},
{
"kind": "ui-named-argument",
"line": 1550,
"line": 1551,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Setup code was not accepted",
"surface": "android",
@ -2107,7 +2107,7 @@
},
{
"kind": "ui-named-argument",
"line": 1554,
"line": 1555,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Use setup code",
"surface": "android",
@ -2115,7 +2115,7 @@
},
{
"kind": "ui-named-argument",
"line": 1585,
"line": 1586,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Manual setup",
"surface": "android",
@ -2123,7 +2123,7 @@
},
{
"kind": "ui-named-argument",
"line": 1588,
"line": 1589,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Gateway URL",
"surface": "android",
@ -2131,7 +2131,7 @@
},
{
"kind": "ui-named-argument",
"line": 1590,
"line": 1591,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Host",
"surface": "android",
@ -2139,7 +2139,7 @@
},
{
"kind": "ui-named-argument",
"line": 1591,
"line": 1592,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Port",
"surface": "android",
@ -2147,7 +2147,7 @@
},
{
"kind": "ui-named-argument",
"line": 1594,
"line": 1595,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Use the Gateway computer's LAN address or secure remote hostname.",
"surface": "android",
@ -2155,7 +2155,7 @@
},
{
"kind": "ui-named-argument",
"line": 1601,
"line": 1602,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Token",
"surface": "android",
@ -2163,7 +2163,7 @@
},
{
"kind": "ui-named-argument",
"line": 1602,
"line": 1603,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Paste token",
"surface": "android",
@ -2171,7 +2171,7 @@
},
{
"kind": "ui-named-argument",
"line": 1604,
"line": 1605,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Paste a shared Gateway token or operator-issued token.",
"surface": "android",
@ -2179,7 +2179,7 @@
},
{
"kind": "ui-named-argument",
"line": 1611,
"line": 1612,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Password",
"surface": "android",
@ -2187,7 +2187,7 @@
},
{
"kind": "ui-named-argument",
"line": 1612,
"line": 1613,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Password optional",
"surface": "android",
@ -2195,7 +2195,7 @@
},
{
"kind": "ui-named-argument",
"line": 1616,
"line": 1617,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Connection type",
"surface": "android",
@ -2203,7 +2203,7 @@
},
{
"kind": "ui-named-argument",
"line": 1618,
"line": 1619,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Local network",
"surface": "android",
@ -2211,7 +2211,7 @@
},
{
"kind": "ui-named-argument",
"line": 1619,
"line": 1620,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Secure remote",
"surface": "android",
@ -2219,7 +2219,7 @@
},
{
"kind": "ui-named-argument",
"line": 1622,
"line": 1623,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Local works for LAN or emulator hosts. Secure remote is for wss:// or Tailscale Serve/Funnel.",
"surface": "android",
@ -2227,7 +2227,7 @@
},
{
"kind": "ui-named-argument",
"line": 1630,
"line": 1631,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Could not test connection",
"surface": "android",
@ -2235,7 +2235,7 @@
},
{
"kind": "ui-named-argument",
"line": 1635,
"line": 1636,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Test connection",
"surface": "android",
@ -2243,7 +2243,7 @@
},
{
"kind": "ui-call",
"line": 1813,
"line": 1814,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "View details",
"surface": "android",
@ -2251,7 +2251,7 @@
},
{
"kind": "ui-call",
"line": 1846,
"line": 1847,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Connection details",
"surface": "android",
@ -2259,7 +2259,7 @@
},
{
"kind": "ui-call",
"line": 1858,
"line": 1859,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Copy",
"surface": "android",
@ -2267,7 +2267,7 @@
},
{
"kind": "ui-call",
"line": 1863,
"line": 1864,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Close",
"surface": "android",
@ -2275,7 +2275,7 @@
},
{
"kind": "ui-toast",
"line": 1875,
"line": 1876,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Details copied",
"surface": "android",
@ -2283,7 +2283,7 @@
},
{
"kind": "ui-named-argument",
"line": 1960,
"line": 1961,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Approve node access",
"surface": "android",
@ -2291,7 +2291,7 @@
},
{
"kind": "ui-named-argument",
"line": 1967,
"line": 1968,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Gateway pairing is complete. Approve this phone as a node so OpenClaw can use the device capabilities you enable.",
"surface": "android",
@ -2299,7 +2299,7 @@
},
{
"kind": "ui-named-argument",
"line": 1975,
"line": 1976,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "On the Gateway computer, run:",
"surface": "android",
@ -2307,7 +2307,7 @@
},
{
"kind": "ui-named-argument",
"line": 1984,
"line": 1985,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Use the requestId from the pending command in the approve command.",
"surface": "android",
@ -2315,7 +2315,7 @@
},
{
"kind": "ui-named-argument",
"line": 1995,
"line": 1996,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "I have approved",
"surface": "android",
@ -2323,7 +2323,7 @@
},
{
"kind": "ui-named-argument",
"line": 1996,
"line": 1997,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Checking approval…",
"surface": "android",
@ -2331,7 +2331,7 @@
},
{
"kind": "ui-named-argument",
"line": 2008,
"line": 2009,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Still waiting for approval",
"surface": "android",
@ -2339,7 +2339,7 @@
},
{
"kind": "ui-named-argument",
"line": 2011,
"line": 2012,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Run the approve command on the Gateway computer, then check again.",
"surface": "android",
@ -2347,7 +2347,7 @@
},
{
"kind": "ui-named-argument",
"line": 2018,
"line": 2019,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "OK",
"surface": "android",
@ -2355,7 +2355,7 @@
},
{
"kind": "ui-named-argument",
"line": 2168,
"line": 2169,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Copy approval command",
"surface": "android",
@ -2363,7 +2363,7 @@
},
{
"kind": "ui-named-argument",
"line": 2194,
"line": 2195,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Only enable access you are comfortable letting OpenClaw use while this phone is connected. You can change these later in Android Settings.",
"surface": "android",
@ -2371,7 +2371,7 @@
},
{
"kind": "ui-named-argument",
"line": 2206,
"line": 2207,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Continue",
"surface": "android",
@ -2379,7 +2379,7 @@
},
{
"kind": "ui-named-argument",
"line": 2233,
"line": 2234,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Back",
"surface": "android",
@ -2387,7 +2387,7 @@
},
{
"kind": "ui-named-argument",
"line": 2280,
"line": 2281,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Permissions",
"surface": "android",
@ -2395,7 +2395,7 @@
},
{
"kind": "conditional-branch",
"line": 2605,
"line": 2606,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "The code may have expired or been generated for another Gateway.",
"surface": "android",
@ -2403,7 +2403,7 @@
},
{
"kind": "conditional-branch",
"line": 2609,
"line": 2610,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Gateway password is required. Enter it again or edit this connection.",
"surface": "android",
@ -2411,7 +2411,7 @@
},
{
"kind": "conditional-branch",
"line": 2610,
"line": 2611,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Gateway password is invalid. Re-enter it or reset this gateway connection.",
"surface": "android",
@ -2419,7 +2419,7 @@
},
{
"kind": "conditional-branch",
"line": 2611,
"line": 2612,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Gateway token is required. Enter it again or edit this connection.",
"surface": "android",
@ -2427,7 +2427,7 @@
},
{
"kind": "conditional-branch",
"line": 2613,
"line": 2614,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Gateway requires this device identity. Re-authenticate or reset this gateway connection.",
"surface": "android",
@ -2435,7 +2435,7 @@
},
{
"kind": "conditional-branch",
"line": 2617,
"line": 2618,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Saved authentication is invalid. Re-authenticate or reset this gateway connection.",
"surface": "android",
@ -2443,7 +2443,7 @@
},
{
"kind": "conditional-branch",
"line": 2618,
"line": 2619,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Gateway authentication is not configured. Edit this connection and try again.",
"surface": "android",
@ -2451,7 +2451,7 @@
},
{
"kind": "conditional-branch",
"line": 2619,
"line": 2620,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Gateway authentication needs review. Check gateway settings, then retry.",
"surface": "android",
@ -2459,7 +2459,7 @@
},
{
"kind": "conditional-branch",
"line": 2636,
"line": 2637,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "$summary $it",
"surface": "android",
@ -2467,7 +2467,7 @@
},
{
"kind": "ui-toast",
"line": 2758,
"line": 2759,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Approval command copied",
"surface": "android",
@ -2475,7 +2475,7 @@
},
{
"kind": "conditional-branch",
"line": 2820,
"line": 2821,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Granted",
"surface": "android",
@ -2483,7 +2483,7 @@
},
{
"kind": "conditional-branch",
"line": 2820,
"line": 2821,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt",
"source": "Not granted",
"surface": "android",
@ -5723,7 +5723,7 @@
},
{
"kind": "ui-call",
"line": 201,
"line": 199,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/chat/ChatComposer.kt",
"source": "Type a message…",
"surface": "android",
@ -5731,7 +5731,7 @@
},
{
"kind": "ui-named-argument",
"line": 211,
"line": 209,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/chat/ChatComposer.kt",
"source": "Gateway is offline. Text messages are queued and sent after reconnecting.",
"surface": "android",
@ -5739,7 +5739,7 @@
},
{
"kind": "ui-named-argument",
"line": 240,
"line": 238,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/chat/ChatComposer.kt",
"source": "Select thinking level",
"surface": "android",
@ -5747,7 +5747,7 @@
},
{
"kind": "ui-named-argument",
"line": 264,
"line": 262,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/chat/ChatComposer.kt",
"source": "Attach",
"surface": "android",
@ -5755,7 +5755,7 @@
},
{
"kind": "ui-named-argument",
"line": 272,
"line": 270,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/chat/ChatComposer.kt",
"source": "Refresh",
"surface": "android",
@ -5763,7 +5763,7 @@
},
{
"kind": "ui-named-argument",
"line": 280,
"line": 278,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/chat/ChatComposer.kt",
"source": "Abort",
"surface": "android",
@ -5771,7 +5771,7 @@
},
{
"kind": "ui-named-argument",
"line": 325,
"line": 323,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/chat/ChatComposer.kt",
"source": "Send",
"surface": "android",
@ -5779,7 +5779,7 @@
},
{
"kind": "ui-named-argument",
"line": 351,
"line": 349,
"path": "apps/android/app/src/main/java/ai/openclaw/app/ui/chat/ChatComposer.kt",
"source": "No commands found",
"surface": "android",

View file

@ -206,25 +206,23 @@ private fun cronDeliveryLabel(delivery: JsonObject?): String {
val value = delivery ?: return "Default"
val mode = value.string("mode") ?: return "Default"
return listOfNotNull(
mode.replaceFirstChar { it.uppercaseChar() },
value.string("channel"),
value.string("to"),
value.string("accountId")?.let { "Account $it" },
)
.joinToString(" · ")
mode.replaceFirstChar { it.uppercaseChar() },
value.string("channel"),
value.string("to"),
value.string("accountId")?.let { "Account $it" },
).joinToString(" · ")
}
private fun cronFailureAlertLabel(failureAlert: JsonElement?): String {
if ((failureAlert as? JsonPrimitive)?.booleanOrNull == false) return "Off"
val alert = failureAlert.asObjectOrNull() ?: return "Default"
return listOfNotNull(
alert.long("after")?.let { "After $it" },
alert.string("mode")?.replaceFirstChar { it.uppercaseChar() },
alert.string("channel"),
alert.string("to"),
alert.long("cooldownMs")?.takeIf { it > 0L }?.let { "Cooldown ${formatCronInterval(it)}" },
)
.joinToString(" · ")
alert.long("after")?.let { "After $it" },
alert.string("mode")?.replaceFirstChar { it.uppercaseChar() },
alert.string("channel"),
alert.string("to"),
alert.long("cooldownMs")?.takeIf { it > 0L }?.let { "Cooldown ${formatCronInterval(it)}" },
).joinToString(" · ")
.ifBlank { "On" }
}

View file

@ -107,5 +107,4 @@ internal class ValidatedNetworkState<T>(
* True when the network reports a validated internet capability. Exposed internal so the
* predicate can be unit-tested without a Robolectric ConnectivityManager shadow.
*/
internal fun isTransportValidated(capabilities: NetworkCapabilities): Boolean =
capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
internal fun isTransportValidated(capabilities: NetworkCapabilities): Boolean = capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)

View file

@ -4,9 +4,9 @@ import ai.openclaw.app.BuildConfig
import ai.openclaw.app.CameraHudKind
import ai.openclaw.app.gateway.GatewaySession
import android.content.Context
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.withContext
import kotlinx.serialization.json.JsonPrimitive
import kotlinx.serialization.json.buildJsonArray
@ -173,6 +173,5 @@ class CameraHandler(
}
}
private fun parseIncludeAudio(paramsJson: String?): Boolean? =
parseJsonBooleanFlag(parseJsonParamsObject(paramsJson), "includeAudio")
private fun parseIncludeAudio(paramsJson: String?): Boolean? = parseJsonBooleanFlag(parseJsonParamsObject(paramsJson), "includeAudio")
}

View file

@ -571,7 +571,8 @@ fun OnboardingFlow(
val message =
when (scanned.error) {
GatewayEndpointValidationError.INSECURE_REMOTE_URL,
GatewayEndpointValidationError.IPV6_ZONE_ID_UNSUPPORTED ->
GatewayEndpointValidationError.IPV6_ZONE_ID_UNSUPPORTED,
->
gatewayEndpointValidationMessage(scanned.error, GatewayEndpointInputSource.QR_SCAN)
else -> "That QR code is not an OpenClaw setup QR. Generate a fresh code with openclaw qr, then try again."
}

View file

@ -376,8 +376,7 @@ private fun WorkspaceFileContent(file: GatewayWorkspaceFile) {
}
/** File extensions double as fence language hints; unknown ones render plain. */
private fun workspaceLanguageHint(name: String): String? =
name.substringAfterLast('.', missingDelimiterValue = "").lowercase().ifEmpty { null }
private fun workspaceLanguageHint(name: String): String? = name.substringAfterLast('.', missingDelimiterValue = "").lowercase().ifEmpty { null }
/** Exports one previewed file through the system share sheet via FileProvider. */
private fun shareWorkspaceFile(

View file

@ -50,10 +50,50 @@ private val kotlinSpec =
CodeLanguageSpec(
keywords =
setOf(
"as", "break", "by", "catch", "class", "companion", "constructor", "continue", "data", "do", "else",
"enum", "false", "finally", "for", "fun", "if", "import", "in", "init", "interface", "internal", "is",
"lateinit", "null", "object", "override", "package", "private", "protected", "public", "return",
"sealed", "super", "suspend", "this", "throw", "true", "try", "typealias", "val", "var", "when", "while",
"as",
"break",
"by",
"catch",
"class",
"companion",
"constructor",
"continue",
"data",
"do",
"else",
"enum",
"false",
"finally",
"for",
"fun",
"if",
"import",
"in",
"init",
"interface",
"internal",
"is",
"lateinit",
"null",
"object",
"override",
"package",
"private",
"protected",
"public",
"return",
"sealed",
"super",
"suspend",
"this",
"throw",
"true",
"try",
"typealias",
"val",
"var",
"when",
"while",
),
lineComment = "//",
blockComment = "/*" to "*/",
@ -67,11 +107,59 @@ private val swiftSpec =
CodeLanguageSpec(
keywords =
setOf(
"actor", "as", "associatedtype", "async", "await", "break", "case", "catch", "class", "continue",
"default", "defer", "deinit", "do", "else", "enum", "extension", "fallthrough", "false", "fileprivate",
"for", "func", "guard", "if", "import", "in", "init", "internal", "is", "let", "mutating", "nil", "open",
"override", "private", "protocol", "public", "repeat", "return", "self", "some", "static", "struct",
"super", "switch", "throw", "throws", "true", "try", "typealias", "var", "where", "while",
"actor",
"as",
"associatedtype",
"async",
"await",
"break",
"case",
"catch",
"class",
"continue",
"default",
"defer",
"deinit",
"do",
"else",
"enum",
"extension",
"fallthrough",
"false",
"fileprivate",
"for",
"func",
"guard",
"if",
"import",
"in",
"init",
"internal",
"is",
"let",
"mutating",
"nil",
"open",
"override",
"private",
"protocol",
"public",
"repeat",
"return",
"self",
"some",
"static",
"struct",
"super",
"switch",
"throw",
"throws",
"true",
"try",
"typealias",
"var",
"where",
"while",
),
lineComment = "//",
blockComment = "/*" to "*/",
@ -84,12 +172,62 @@ private val typescriptSpec =
CodeLanguageSpec(
keywords =
setOf(
"abstract", "any", "as", "async", "await", "boolean", "break", "case", "catch", "class", "const",
"continue", "declare", "default", "delete", "do", "else", "enum", "export", "extends", "false",
"finally", "for", "from", "function", "if", "implements", "import", "in", "instanceof", "interface",
"let", "namespace", "never", "new", "null", "number", "of", "readonly", "return", "static", "string",
"super", "switch", "this", "throw", "true", "try", "type", "typeof", "undefined", "unknown", "var",
"void", "while", "yield",
"abstract",
"any",
"as",
"async",
"await",
"boolean",
"break",
"case",
"catch",
"class",
"const",
"continue",
"declare",
"default",
"delete",
"do",
"else",
"enum",
"export",
"extends",
"false",
"finally",
"for",
"from",
"function",
"if",
"implements",
"import",
"in",
"instanceof",
"interface",
"let",
"namespace",
"never",
"new",
"null",
"number",
"of",
"readonly",
"return",
"static",
"string",
"super",
"switch",
"this",
"throw",
"true",
"try",
"type",
"typeof",
"undefined",
"unknown",
"var",
"void",
"while",
"yield",
),
lineComment = "//",
blockComment = "/*" to "*/",
@ -100,9 +238,42 @@ private val pythonSpec =
CodeLanguageSpec(
keywords =
setOf(
"and", "as", "assert", "async", "await", "break", "case", "class", "continue", "def", "del", "elif",
"else", "except", "finally", "for", "from", "global", "if", "import", "in", "is", "lambda", "match",
"nonlocal", "not", "or", "pass", "raise", "return", "try", "while", "with", "yield", "False", "None",
"and",
"as",
"assert",
"async",
"await",
"break",
"case",
"class",
"continue",
"def",
"del",
"elif",
"else",
"except",
"finally",
"for",
"from",
"global",
"if",
"import",
"in",
"is",
"lambda",
"match",
"nonlocal",
"not",
"or",
"pass",
"raise",
"return",
"try",
"while",
"with",
"yield",
"False",
"None",
"True",
),
lineComment = "#",
@ -114,9 +285,33 @@ private val bashSpec =
CodeLanguageSpec(
keywords =
setOf(
"break", "case", "continue", "declare", "do", "done", "elif", "else", "esac", "exit", "export", "fi",
"for", "function", "if", "in", "local", "readonly", "return", "select", "set", "shift", "source",
"then", "unset", "until", "while",
"break",
"case",
"continue",
"declare",
"do",
"done",
"elif",
"else",
"esac",
"exit",
"export",
"fi",
"for",
"function",
"if",
"in",
"local",
"readonly",
"return",
"select",
"set",
"shift",
"source",
"then",
"unset",
"until",
"while",
),
lineComment = "#",
lineCommentNeedsBoundary = true,

View file

@ -34,7 +34,11 @@ internal fun slashCommandText(command: ChatCommandEntry): String {
command.textAliases
.firstOrNull { alias -> alias.startsWith("/") && alias.length > 1 }
?.let { return it }
val name = command.name.trim().removePrefix("/").takeIf { it.isNotEmpty() } ?: "help"
val name =
command.name
.trim()
.removePrefix("/")
.takeIf { it.isNotEmpty() } ?: "help"
return "/$name"
}

View file

@ -91,11 +91,9 @@ internal data class SheetComposerSendAction(
val sendMessage: Boolean,
)
internal fun resolveSheetSlashCommandSelection(command: ChatCommandEntry): SheetSlashCommandSelection =
SheetSlashCommandSelection(input = slashCommandCompletion(command))
internal fun resolveSheetSlashCommandSelection(command: ChatCommandEntry): SheetSlashCommandSelection = SheetSlashCommandSelection(input = slashCommandCompletion(command))
internal fun resolveSheetComposerSendAction(input: String): SheetComposerSendAction =
SheetComposerSendAction(sendMessage = input.trim().isNotEmpty())
internal fun resolveSheetComposerSendAction(input: String): SheetComposerSendAction = SheetComposerSendAction(sendMessage = input.trim().isNotEmpty())
/** Applies a draft exactly once so restored prompts do not overwrite user edits. */
internal fun applyDraftText(

View file

@ -8,10 +8,10 @@ import android.content.Context
import android.content.Intent
import android.widget.Toast
import androidx.compose.foundation.combinedClickable
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.text.selection.SelectionContainer
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.AlertDialog

View file

@ -37,8 +37,7 @@ private val BodyPath =
.parsePathString(
"M60 10 C30 10 15 35 15 55 C15 75 30 95 45 100 L45 110 L55 110 L55 100 " +
"C55 100 60 102 65 100 L65 110 L75 110 L75 100 C90 95 105 75 105 55 C105 35 90 10 60 10Z",
)
.toPath()
).toPath()
private val LeftClawPath =
PathParser().parsePathString("M20 45 C5 40 0 50 5 60 C10 70 20 65 25 55 C28 48 25 45 20 45Z").toPath()
private val RightClawPath =
@ -50,6 +49,7 @@ private val CoralBright = Color(0xFFFF4D4D)
private val CoralDark = Color(0xFF991B1B)
private val EyeDark = Color(0xFF050810)
private val EyeGlow = Color(0xFF00E5CC)
// Claws hinge on their body-facing edge, antennae rotate around their own center.
private val LeftClawPivot = Offset(26f, 53f)
private val RightClawPivot = Offset(94f, 53f)
@ -183,15 +183,19 @@ private fun rememberMascotPose(): MascotPose {
}
}
private fun clawSnapKeyframes() = keyframes {
durationMillis = 4000
0f at 0 using EaseInOut
0f at 3400 using EaseInOut
-8f at 3600 using EaseInOut
0f at 3800 using EaseInOut
}
private fun clawSnapKeyframes() =
keyframes {
durationMillis = 4000
0f at 0 using EaseInOut
0f at 3400 using EaseInOut
-8f at 3600 using EaseInOut
0f at 3800 using EaseInOut
}
private fun DrawScope.drawMascot(pose: MascotPose, tint: Color?) {
private fun DrawScope.drawMascot(
pose: MascotPose,
tint: Color?,
) {
val bodyBrush =
if (tint == null) {
Brush.linearGradient(

View file

@ -204,8 +204,7 @@ object TalkDirectiveParser {
return null
}
private fun JsonObject.valueForKey(key: String): JsonElement? =
this[key] ?: entries.firstOrNull { it.key.equals(key, ignoreCase = true) }?.value
private fun JsonObject.valueForKey(key: String): JsonElement? = this[key] ?: entries.firstOrNull { it.key.equals(key, ignoreCase = true) }?.value
}
private fun JsonElement?.asStringOrNull(): String? = (this as? JsonPrimitive)?.takeIf { it.isString }?.content

View file

@ -79,7 +79,8 @@ class CronJobDetailTest {
payload: String =
"""{"kind":"agentTurn","message":"Summarize the day","model":"openai/gpt-5.5","thinking":"high"}""",
): JsonObject =
Json.parseToJsonElement(
Json
.parseToJsonElement(
"""
{
"id": "job-1",
@ -108,6 +109,5 @@ class CronJobDetailTest {
}
}
""".trimIndent(),
)
.jsonObject
).jsonObject
}

View file

@ -26,17 +26,16 @@ class InvokeErrorParserTest {
@Test
fun parseInvokeErrorMessage_rejectsNonCanonicalCodePrefix() {
listOf(
"IllegalStateException: boom",
"2FAST: boom",
"_PRIVATE: boom",
"CAMERA-PERMISSION: boom",
)
.forEach { raw ->
val parsed = parseInvokeErrorMessage(raw)
assertEquals("UNAVAILABLE", parsed.code)
assertEquals(raw, parsed.message)
assertFalse(parsed.hadExplicitCode)
}
"IllegalStateException: boom",
"2FAST: boom",
"_PRIVATE: boom",
"CAMERA-PERMISSION: boom",
).forEach { raw ->
val parsed = parseInvokeErrorMessage(raw)
assertEquals("UNAVAILABLE", parsed.code)
assertEquals(raw, parsed.message)
assertFalse(parsed.hadExplicitCode)
}
}
@Test

View file

@ -31,10 +31,11 @@ class NodeUtilsTest {
@Test
fun parseJsonBooleanFlag_acceptsJsonBooleanLiterals() {
val params = buildJsonObject {
put("enabled", true)
put("disabled", false)
}
val params =
buildJsonObject {
put("enabled", true)
put("disabled", false)
}
assertEquals(true, parseJsonBooleanFlag(params, "enabled"))
assertEquals(false, parseJsonBooleanFlag(params, "disabled"))