improve: refresh Android overview control surface#95557
Conversation
|
Thanks for the contribution. ClawSweeper proposes closing this for now: the implementation may be reasonable, but passing review and proof does not establish that OpenClaw should add this product surface. Close for now: the branch is coherent, proof-backed, and I found no concrete correctness or security finding, but it is a broad contributor-authored Android control-surface/product-navigation refresh without maintainer-confirmed product direction. This is a proposal only until the separate default-off apply policy is enabled and all live maintainer-signal checks pass. A maintainer can sponsor the direction, request a narrower version, or apply Review detailsBest possible solution: Keep the current Android surface unless an Android owner sponsors this direction; use #46058 for broader scoping or ask for narrower owner-approved UI or hardening slices. Do we have a high-confidence way to reproduce the issue? Not applicable: this is an Android UI/product refresh rather than a broken existing behavior report. The PR supplies installed-APK screenshots/GIF proof for the changed tabs. Is this the best way to solve the issue? No for landing as-is: the implementation appears coherent, but the best path is maintainer-confirmed Android product direction or narrower owner-approved slices rather than an unsponsored broad control-surface refresh. Security review: Security review cleared: No concrete security or supply-chain regression found; the debug receiver is non-exported and signature-permission gated on the PR head. AGENTS.md: found and applied where relevant. What I checked:
Likely related people:
Codex review notes: model internal, reasoning high; reviewed against 63fdc57b3ac2. |
e569d36 to
bcd1690
Compare
There was a problem hiding this comment.
Pull request overview
Refreshes the Android app’s “Overview” and adjacent tab control surfaces to better match a native mobile hierarchy (layered dark surfaces, semantic statuses, more scannable gateway/node/session signals), and follows up with Android lint/manifest hardening for permissions and debug-only components.
Changes:
- Reworks Overview/Chat/Voice/Sessions headers and key panels to use a consistent, more native-feeling control surface (status pill, metric tiles, Talk entry point, session source labeling).
- Introduces a dedicated Settings destination for “Providers & Models” and routes attention/rows accordingly.
- Fixes Android lint blockers via manifest and API annotation updates, plus tighter debug receiver permissions and updated voice E2E scripting.
Reviewed changes
Copilot reviewed 15 out of 15 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
| apps/android/scripts/voice-e2e.sh | Runs the debug voice E2E broadcast as the app user (run-as) to align with the tightened debug receiver exposure. |
| apps/android/app/src/test/java/ai/openclaw/app/ui/ShellScreenLogicTest.kt | Adds/updates unit coverage for new Overview header/metrics/agent/session-source logic and updated settings routing. |
| apps/android/app/src/play/AndroidManifest.xml | Removes scoped media/storage permissions from the Play flavor merged manifest and caps legacy storage permission by SDK. |
| apps/android/app/src/main/java/ai/openclaw/app/ui/VoiceScreen.kt | Refreshes Voice header styling and Talk orb visual treatment (logo header, stronger hierarchy). |
| apps/android/app/src/main/java/ai/openclaw/app/ui/ShellScreen.kt | Major Overview redesign: status pill, primary panel, metric grid, Talk entry, session source labels, and Providers & Models settings row. |
| apps/android/app/src/main/java/ai/openclaw/app/ui/SettingsScreens.kt | Adds ProvidersModels route and wires it into settings navigation. |
| apps/android/app/src/main/java/ai/openclaw/app/ui/SessionsScreen.kt | Renames “Live” filter to “Current” and updates spacing/typography to match refreshed surfaces. |
| apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt | Treats notification permission as granted on pre-Android 13 devices to match platform behavior. |
| apps/android/app/src/main/java/ai/openclaw/app/ui/design/ClawSurfaces.kt | Updates default panel surface styling (alpha/elevation) to support the new layered look. |
| apps/android/app/src/main/java/ai/openclaw/app/ui/design/ClawNavigation.kt | Refines bottom nav surface elevation/alpha and selected-state styling to reduce “heavy/flat” feel. |
| apps/android/app/src/main/java/ai/openclaw/app/ui/chat/ChatScreen.kt | Updates Chat header and message bubble surfaces to the refreshed styling and status semantics. |
| apps/android/app/src/main/java/ai/openclaw/app/node/DeviceHandler.kt | Adds lint-suppressed helper for installed-app visibility that respects Android package-visibility constraints. |
| apps/android/app/src/main/java/ai/openclaw/app/gateway/GatewayDiscovery.kt | Replaces @TargetApi with @RequiresApi for modern API annotations. |
| apps/android/app/src/main/java/ai/openclaw/app/chat/ChatController.kt | Minor formatting/structure adjustments to session entry parsing. |
| apps/android/app/src/debug/AndroidManifest.xml | Locks down the debug-only voice E2E receiver with a signature permission and exported=false. |
|
@clawsweeper re-review |
|
🦞🧹 I asked ClawSweeper to review this item again. |
c6f63f6 to
9ea48a9
Compare
* improve android overview control surface * fix android lint gates * fix android voice e2e debug broadcast * harden android voice e2e receiver * fix(android): clarify Talk entry copy --------- Co-authored-by: joshavant <[email protected]>
What Problem This Solves
Resolves a problem where the Android Overview and adjacent main tabs felt visually heavier and flatter than the intended native mobile control surface. The Overview also over-emphasized warning states and dashboard-like boxes, which made real gateway/node/session state harder to scan.
Why This Change Was Made
This refresh treats the generated concept as visual direction, not a data contract: the Overview now uses stronger hierarchy, layered dark surfaces, semantic status/icon treatment, a prominent Talk entry point, real agent/session/node/provider signals, and aligned Chat/Voice/Settings styling without adding fake CPU, memory, token, integration, or live-session data. Bottom navigation destinations remain unchanged.
The follow-up lint pass also clears Android platform lint blockers around legacy storage permission capping, Android 13 notification permission access, API-level annotations, non-exported debug-only receiver exposure, and Android package visibility.
Proof media is stored separately in the proof-assets repo, not in this OpenClaw code branch.
AI-assisted: yes. This was implemented and reviewed with Codex; I understand the code changes and kept the implementation bound to existing Android app data/routes rather than generated concept-only placeholders.
User Impact
Android users get a cleaner mobile control surface that makes gateway health, node approval state, node/device status, sessions, Talk, Chat, and settings easier to understand at a glance. Existing routes remain wired to real screens, and the Overview continues to show only data already exposed by the Android app/view model.
Evidence
Fresh proof from the installed Android APK:
Before/after comparison:
Proof bundle:
https://github.com/Solvely-Colin/pr-proof-assets/tree/openclaw-android-overview-control-surface-20260621/openclaw-android-overview-control-surface-20260621
Validation on rebased commit
bcd16901bcoverorigin/main2f33999898:codex review --base origin/main- passed with no actionable correctness issues. The review command's own default Android test probe was blocked by the shell's missing default Java runtime, so Android Gradle proof below was run separately with explicitJAVA_HOME/SDK env..agents/skills/autoreview/scripts/autoreview --mode branch --base origin/main- passed with no accepted/actionable findings; reported patch correct.git diff --check origin/main...HEAD- passedbash -n apps/android/scripts/voice-e2e.sh- passedadb shell run-as ai.openclaw.app am broadcast --user 0 -a ai.openclaw.app.debug.RUN_VOICE_E2E -n ai.openclaw.app/.VoiceE2eReceiver --es mode stop- passed; receiver wrote{"ok":true,"mode":"stop"}through the signature-protected debug path.JAVA_HOME=/opt/homebrew/opt/java ANDROID_HOME="$HOME/Library/Android/sdk" ANDROID_SDK_ROOT="$HOME/Library/Android/sdk" PATH="/opt/homebrew/opt/java/bin:$PATH" ./gradlew :app:ktlintCheck- passedJAVA_HOME=/opt/homebrew/opt/java ANDROID_HOME="$HOME/Library/Android/sdk" ANDROID_SDK_ROOT="$HOME/Library/Android/sdk" PATH="/opt/homebrew/opt/java/bin:$PATH" ./gradlew :app:lintPlayDebug- passedJAVA_HOME=/opt/homebrew/opt/java ANDROID_HOME="$HOME/Library/Android/sdk" ANDROID_SDK_ROOT="$HOME/Library/Android/sdk" PATH="/opt/homebrew/opt/java/bin:$PATH" ./gradlew :app:testPlayDebugUnitTest --tests ai.openclaw.app.ui.ShellScreenLogicTest- passedJAVA_HOME=/opt/homebrew/opt/java ANDROID_HOME="$HOME/Library/Android/sdk" ANDROID_SDK_ROOT="$HOME/Library/Android/sdk" PATH="/opt/homebrew/opt/java/bin:$PATH" ./gradlew :app:assemblePlayDebug- passed