Skip to content

feat(android): align chat, sidebar, and appearance with the web UI - #134939

Merged
steipete merged 23 commits into
openclaw:mainfrom
IWhatsskill:feat/android-v2-web-ui-parity-clean-20260831
Sep 2, 2026
Merged

steipete merged 23 commits into
openclaw:mainfrom
IWhatsskill:feat/android-v2-web-ui-parity-clean-20260831

Conversation

@IWhatsskill

@IWhatsskill IWhatsskill commented Sep 1, 2026 •

Copy link
Copy Markdown
Contributor

What Problem This Solves

Android chat and navigation lagged behind mobile web and iOS: the composer crowded out the conversation, model controls were hard to reach, and sidebar/session and appearance behavior was inconsistent. This keeps the compact composer already landed in #135432 and completes the larger Android parity work.

The maintainer rewrite also repairs stale settings replies, native-thread action eligibility, terminal error visibility, and profile appearance changes lost during offline/read-only profile switching. Final live testing also caught and repaired global New session being blocked after a native chat.

Why This Change Was Made

Settings updates now use one ordered, session-owned flow, checked again when the Gateway request is actually enqueued. Native model ownership comes from canonical Gateway metadata rather than guesses; effort, Fast Mode, and permissions remain available where supported. A current run's diagnostic owner survives spinner cleanup, so a later terminal error stays visible without showing errors from an old run.

Plain New from a locked native conversation now starts an independent session using the selected agent’s defaults. Normal mutable chats retain their parent hooks, while explicit generic fork/worktree actions keep the native-parent restriction and enqueue-time checks.

Appearance uses the existing preference store and synchronization owner. A device-local choice no longer deletes another profile's queued changes, and an acknowledgement retires only its matching queued value without overwriting newer local choices. The three setters share one edit path; this last repair removes 24 production lines. Sidebar navigation has one owner, with the obsolete adaptive bottom-bar path removed.

Contributor history and credit are retained. Thanks @IWhatsskill and Ayaan Zaidi.

User Impact

  • A full-width editor and compact, single-row controls; readable model names, aligned voice icon, 48dp touch targets, and only one filled primary action.
  • Searchable model controls with authentication repair, session settings, and clear native-model restrictions. A blocked draft keeps a disabled Send action instead of silently changing into Talk.
  • Native session/catalog navigation, working global New after a native conversation, reliable sidebar ordering, and theme choices with readable light/dark contrast and visible selection states.
  • Offline appearance edits reach their original profile once it reconnects; newer local choices survive app recreation and acknowledgement.

Evidence

Candidate: beb9db2d5e2617dd08883e8284cab88fcde6f9f2, integrating main c4b8d42bd42cdf4ef447bd48dc96abc1fa33c27f.

The complete local Android matrix passes: 2,580 Play, 2,711 ThirdParty, 164 Wear, and 10 shared tests (5,465 total); both phone APK assemblies; phone/Wear/shared framework lint; and all four ktlint targets. The 72 lint-runner tests, native-i18n verification (4,465 entries), and changed text-format checks also pass. Fresh isolated Codex autoreview found no actionable findings at its configured P0 scope; manual owner/sibling review and the behavior proofs below are separate evidence.

The two appearance regressions and the global-New regression were captured failing against the pre-fix source, then passed after repair. The same failure was reproduced through the running app: profile A's three offline changes disappeared after profile B made read-only local choices. After an in-place APK upgrade, the identical flow produced exactly one successful write per key to A, none to B, and no additional writes on a second reconnect. The newer local theme, mode, and accent remained selected after recreation and both reconnects.

A real API36 Android app and isolated Gateway exercised native Codex session creation, Send and visible completion, an injected HTTP400 displayed in chat, and successful recovery in the same session. The final source-equivalent APK was upgraded in place: global New from the existing locked native chat created an empty new session, Send completed, and the old transcript remained unchanged. Appearance stayed selected and the model name was readable with the keyboard open and in the model sheet at 320dp.

Final APK SHA256: 19637b51891baddc6f33582d1512826421639ab01ac431f5836c1a7b6a67d8ed. It was built immediately before the final commit, so its generated build label names 4205232; the verified source patch matches beb9db2 (patch SHA256 203920258405bf9454d0904906faf0840a963556da14320b5825c1fc94a11310). Inference was scripted over loopback; this is not external-provider quality/authentication, Play delivery, physical-device, or live microphone/Talk audio proof. ThirdParty was built/tested/linted, not installed.

The first main-integration build caught an unused Unit expression introduced by the new formatter. Removing that redundant expression fixed both flavor builds without weakening compiler checks. Earlier CI stripe construction is already repaired on main; this PR retains the real-CLI regression and matching documentation, not a duplicate production workaround.

Exact-head hosted CI: passed on the exact pushed head: 155 successful jobs, 14 intentional skips, no failures; all six Android jobs and openclaw/ci-gate passed. No hosted failure is waived by local results. The latest completed ClawSweeper review has no concrete code finding and asks for exact-head Android/aggregate CI. Upgrade/profile-switch proof is covered above; required CI is checked before native landing. The fresh review of beb9db2 is complete with no code/security finding. The maintainer accepts the integrated Android/appearance scope; the documented upgrade and profile-switch proof is retained. The optional CI-tooling split is unnecessary because the production stripe fix is already on main, leaving regression coverage and matching documentation here. The earlier CI run on 4205232 was superseded/cancelled, not counted as passing.

Scope and Remaining Work

Against the integrated main baseline: production +6,265/−1,622 (net +4,643) across 33 files; tests/support +7,460/−372 (net +7,088) across 37 files. Generated inventory is +47, documentation +45, licenses +81, and build/resources +40. This is feature-sized catalog/sidebar/theme/settings work; formatter normalization is included in those raw counts, not presented as a new capability.

The feature adds seven SharedPreferences keys for appearance synchronization, sidebar preferences, and preservation of existing device-local themes. The approved repair adds no further preference key, store, SQLite schema, Gateway configuration/environment option, protocol version, dependency, or public CLI option. Main's newer Mermaid assets and Android dependency/tooling updates are preserved.

Named follow-ups: iOS native-model lock and global-New parent parity (source-confirmed, not iOS live-tested here); precise native Delete/rewind eligibility; shared stopped-run/error-envelope wording; native catalog archive support. These are not claimed fixed by this Android PR.

Visual evidence

Corrected final screenshots: the tall light-theme composer previously labelled “After” was an intermediate broken layout, not the merged result. The captures below replace that misleading comparison. They are unchanged screenshots from the retained September 1 live-app verification, not a new test run or a mockup.

Android before and after — matched 320dp viewport

Both captures are 1080×2400 at 540dpi, with the keyboard hidden and an empty composer beneath a completed synthetic conversation. The baseline is main 0ac1855; the final tested APK is source-equivalent to beb9db2, merged as 5fa8356.

The baseline already includes the compact composer from #135432. This pair shows the larger PR's navigation and presentation changes, not a new reduction in composer height. Theme, selected model, and transcript differ.

Before — compact composer, old navigation After — final tested Android build
Android before the parity rewrite at 320dp, with the old header and bottom navigation Final Android at 320dp, with a compact bottom composer and the model, effort, microphone, and Talk action on one row

Final keyboard and model-sheet states

The resting composer measures approximately 104dp high, both with the keyboard hidden and with this one-line draft. Model, effort, microphone, and primary action share the bottom row. The visible “GPT-5.6 Sol” label fits at 320dp; long names can still truncate. The expanded model sheet is an overlay, not part of the resting composer.

Draft with real Android keyboard — one filled Send action Expanded model sheet
Final Android composer with a one-line draft, readable model name, aligned controls, and the real keyboard Final Android model sheet showing model selection, permissions, and usage details
Mobile-web and iOS reference screenshots

These are the earlier genuine Chrome and iOS Simulator captures used for comparison, with synthetic fixture data. Web was served from 91067e3 at 320 CSS px; the iOS build is 2358cff at 402pt. They are reference captures, not live Gateway or keyboard proof for those platforms.

The nominal resting-card targets are 105 CSS px on mobile web and 104pt on iOS, versus the measured approximately 104dp Android card. The device widths differ: displaying all screenshots at an equal image width would enlarge Android relative to iOS. Compare logical dimensions and bottom-row placement, not raw image pixels.

Mobile web — 320 CSS px wide iOS — 402pt wide
Actual mobile-web reference with the composer controls along the bottom Actual iOS reference with the composer controls along the bottom
Earlier sidebar-ordering proof (pre-rewrite screenshots)

These previously published captures show the earlier ordering repair, not the final composer or appearance. With Work hidden, dragging Settings below Home preserves the intended order. Fixture themes differ; the pair demonstrates ordering only.

Earlier ordering Ordering repaired in that iteration
Settings stays above Home after the drag Settings moves below Home after the drag

@clawsweeper

clawsweeper Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

🦞👀
ClawSweeper picked this up.

Pull request received. I will update this pull request when review starts.

@openclaw-barnacle openclaw-barnacle Bot added app: android App: android size: XL maintainer Maintainer-authored PR labels Sep 1, 2026
@IWhatsskill
IWhatsskill marked this pull request as ready for review September 1, 2026 06:59
@clawsweeper clawsweeper Bot added P2 Normal backlog priority with limited blast radius. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. proof: sufficient ClawSweeper judged the real behavior proof convincing. proof: 🎥 video Contributor real behavior proof includes video or recording evidence. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. labels Sep 1, 2026
@clawsweeper

clawsweeper Bot commented Sep 1, 2026 •

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge. Reviewed September 1, 2026, 9:28 PM ET / September 2, 2026, 01:28 UTC.

ClawSweeper review

What this changes

This PR expands the Android companion app’s chat, session navigation, sidebar, appearance controls, and related tests to align with the web UI.

Merge readiness

⚠️ Ready for maintainer review - 3 items remain

Keep open for assigned maintainer review: no concrete introduced correctness defect was found, but this member-authored, maintainer-labelled Android feature still needs its exact-head Android and aggregate CI completion.

Priority: P2
Reviewed head: beb9db2d5e2617dd08883e8284cab88fcde6f9f2
Owner decision: Required. See Decision needed.

Review scores

Measure Result What it means
Overall readiness 🐚 platinum hermit (4/6) No introduced blocking defect was identified, with exact-head CI and current-main source comparison remaining review limits.
Proof confidence 🌊 off-meta tidepool Not applicable: Repository state identifies this as a member-authored PR, so the external-contributor proof gate does not apply; the PR body nevertheless describes API-36 app and isolated-Gateway after-fix runs, while final attached captures are not supplied here.
Patch quality 🐚 platinum hermit (4/6) No actionable review findings were identified.

Verification

Check Result Evidence
Real behavior Not applicable Not applicable: Repository state identifies this as a member-authored PR, so the external-contributor proof gate does not apply; the PR body nevertheless describes API-36 app and isolated-Gateway after-fix runs, while final attached captures are not supplied here.
Evidence reviewed 7 items Native-session creation owner: Plain New omits parent lineage for a model-selection-locked native session, while explicit worktree creation retains the guarded parent path.
Persisted appearance owner: Queued appearance edits are keyed by Gateway stable ID, profile ID, and preference key, preventing a reconnect under another profile from consuming the pending edit.
Gateway contract alignment: The Android dashboard route follows the existing exact-session Control UI path contract, including reserved and encoded path segments.
Findings None None.
Security None None.

How this fits together

The Android companion app renders Gateway-backed chat, sessions, and settings on a device. The change maps Gateway session/profile state into Android UI and persists device-local preferences while sending supported updates back to the Gateway.

flowchart LR
  A[Gateway session and profile state] --> B[Android runtime]
  C[Local preference store] --> B
  B --> D[Chat and sidebar controllers]
  D --> E[Android chat and settings UI]
  E --> F[Gateway updates and local persistence]
Loading

Decision needed

Question Recommendation
Does the Android owner approve this broad UI and persisted-preference expansion once the exact-head Android and aggregate checks complete? Land after exact-head checks: Confirm the pending Android and aggregate checks on this exact head, then accept the reviewed owner-boundary implementation.

Why: The repository state identifies a member-authored PR with a protected maintainer label and an assigned maintainer; this requires explicit human handling rather than automated cleanup.

Before merge

  • Resolve merge risk (P1) - The new local preference synchronization and migration affect existing appearance choices; the PR describes upgrade coverage, but the supplied exact-head check set is still incomplete.
  • Complete next step (P2) - Await explicit assigned-maintainer handling and completion of the prior exact-head CI rank-up move; no narrow automated repair is identified.
Agent review details

Security

None.

PR surface

PR surface statistics unavailable: the file list is incomplete.

Review metrics

Metric Value Why it matters
Android implementation mix runtime +6,265/-1,622; tests/support +7,460/-372; assets/docs/licenses +166/-62 This is a feature-sized Android change with substantial new persisted UI behavior, so upgrade validation matters alongside normal test coverage.

Stored data model

Persistent data-model change detected: unknown-truncated-pull-files. Confirm migration or upgrade compatibility proof before merge.

Merge-risk options

Maintainer options:

  1. Finish upgrade verification before merge (recommended)
    Complete exact-head Android and aggregate CI, retaining the profile-switch and persisted-preference upgrade coverage before landing.
  2. Pause for a narrower scope decision
    Keep the PR open if the Android owner wants the new persisted appearance and sidebar settings separated from the chat parity work.

Technical review

Best possible solution:

Retain the owner-scoped session and appearance flows, then land only after the assigned Android maintainer accepts the feature scope and the exact-head Android plus aggregate checks finish green.

Do we have a high-confidence way to reproduce the issue?

Not applicable: this is a feature/UI-parity PR rather than a single reported current-production bug; its body describes targeted app runs and upgrade scenarios.

Is this the best way to solve the issue?

Unclear: the inspected owner paths and regression tests are coherent, but unavailable current-main blobs prevent an independent full comparison against the fetched main revision.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against f0bc8ad2d279.

Labels

Label changes:

  • remove merge-risk: 🚨 automation: Current PR review merge-risk labels are merge-risk: 🚨 compatibility.

Label justifications:

  • P2: The PR changes broad companion-app behavior but does not establish an emergency regression.
  • merge-risk: 🚨 compatibility: New persisted appearance synchronization and migration logic can affect existing device-local and profile-specific preferences during upgrade.
  • rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🌊 off-meta tidepool and patch quality is 🐚 platinum hermit.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Not applicable: Repository state identifies this as a member-authored PR, so the external-contributor proof gate does not apply; the PR body nevertheless describes API-36 app and isolated-Gateway after-fix runs, while final attached captures are not supplied here.

Evidence

What I checked:

Likely related people:

  • steipete: Suggested for follow-up; no historical authorship or introduction is verified. (role: unverified routing candidate; confidence: low)
  • Ayaan Zaidi: Suggested for follow-up; no historical authorship or introduction is verified. (role: unverified routing candidate; confidence: low)

Rank-up moves

Optional improvements that raise the rating; they are not merge blockers.

  • Complete the exact-head hosted Android and aggregate CI checks.

Rating scale

Score Internal tier Crab rank Meaning
6/6 S 🦀 challenger crab Exceptional readiness
5/6 A 🦞 diamond lobster Very strong readiness
4/6 B 🐚 platinum hermit Good normal PR; ordinary maintainer review
3/6 C 🦐 gold shrimp Useful, but confidence is limited
2/6 D 🦪 silver shellfish Proof or implementation needs work
1/6 F 🧂 unranked krab Not merge-ready
N/A NA 🌊 off-meta tidepool Rating does not apply

Overall follows the weaker of proof and patch quality.
Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

Workflow

  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

History

Review history (8 earlier review cycles)
  • reviewed 2026-09-01T07:25:09.855Z sha cde3504 :: needs maintainer review before merge. :: none
  • reviewed 2026-09-01T07:35:26.674Z sha cde3504 :: found issues before merge. :: [P2] Reject malformed agent-scoped dashboard keys
  • reviewed 2026-09-01T16:38:58.806Z sha b0e28bb :: needs maintainer review before merge. :: none
  • reviewed 2026-09-01T16:48:43.569Z sha b0e28bb :: needs maintainer review before merge. :: none
  • reviewed 2026-09-01T17:04:03.517Z sha b0e28bb :: needs maintainer review before merge. :: none
  • reviewed 2026-09-01T19:55:20.819Z sha 9786e26 :: needs maintainer review before merge. :: none
  • reviewed 2026-09-02T01:02:11.029Z sha 4205232 :: needs maintainer review before merge. :: none
  • reviewed 2026-09-02T01:14:43.605Z sha beb9db2 :: needs maintainer review before merge. :: none

@clawsweeper clawsweeper Bot removed proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. labels Sep 1, 2026
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Sep 3, 2026
…penclaw#136078)

Replace duplicate node JSON writers with concrete serializers, share gateway
trust UI and cache projections, and delete unused filters and outbox bypasses.
Net production reduction: 827 lines; persisted formats and schemas unchanged.

Keep queued-send acknowledgements on their claimed attempt and preserve
empty-root continuity before retiring accepted rows. Fence New by selection
and request ownership, and hydrate the live selection instead of a stale UI key.

Add real-Room, cancellation, navigation and wire-contract regressions. Verify
with both Android variants and real Gateway/Android emulator flows.

Preserve openclaw#135961. Related: openclaw#135980, openclaw#134939, openclaw#135432. Follow-up: openclaw#136047.
steipete added a commit that referenced this pull request Sep 3, 2026
* fix(android): keep reader navigation out of chat content

Move Jump to latest into the chat header and gate it on the visible latest-content edge. Keep follow intent independent of viewport geometry and remove the transcript inset and overlay.

Cover short, overflowing, near-fitting, resized and large-font histories while preserving header touch targets and composer geometry.

Follow-up to #134939.

* docs(android): correct composer line limit
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Sep 4, 2026
…6742)

* fix(android): keep reader navigation out of chat content

Move Jump to latest into the chat header and gate it on the visible latest-content edge. Keep follow intent independent of viewport geometry and remove the transcript inset and overlay.

Cover short, overflowing, near-fitting, resized and large-font histories while preserving header touch targets and composer geometry.

Follow-up to openclaw#134939.

* docs(android): correct composer line limit
180Sai pushed a commit to 180Sai/openclaw that referenced this pull request Sep 5, 2026
…6742)

* fix(android): keep reader navigation out of chat content

Move Jump to latest into the chat header and gate it on the visible latest-content edge. Keep follow intent independent of viewport geometry and remove the transcript inset and overlay.

Cover short, overflowing, near-fitting, resized and large-font histories while preserving header touch targets and composer geometry.

Follow-up to openclaw#134939.

* docs(android): correct composer line limit
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

app: android App: android docs Improvements or additions to documentation maintainer Maintainer-authored PR merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. P2 Normal backlog priority with limited blast radius. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. size: XL status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants