Repository navigation
Conversation
Co-authored-by: Ayaan Zaidi <hi@obviy.us>
|
🦞👀 Pull request received. I will update this pull request when review starts. |
|
Codex review: needs maintainer review before merge. Reviewed September 1, 2026, 9:28 PM ET / September 2, 2026, 01:28 UTC. ClawSweeper reviewWhat this changesThis PR expands the Android companion app’s chat, session navigation, sidebar, appearance controls, and related tests to align with the web UI. Merge readinessKeep 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 Review scores
Verification
How this fits togetherThe 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]
Decision needed
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
Agent review detailsSecurityNone. PR surfacePR surface statistics unavailable: the file list is incomplete. Review metrics
Stored data modelPersistent data-model change detected: Merge-risk optionsMaintainer options:
Technical reviewBest 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. LabelsLabel changes:
Label justifications:
EvidenceWhat I checked:
Likely related people:
Rank-up movesOptional improvements that raise the rating; they are not merge blockers.
Rating scale
Overall follows the weaker of proof and patch quality. Workflow
HistoryReview history (8 earlier review cycles)
|
…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.
* 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
…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
…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
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
Evidence
Candidate:
beb9db2d5e2617dd08883e8284cab88fcde6f9f2, integrating mainc4b8d42bd42cdf4ef447bd48dc96abc1fa33c27f.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 names4205232; the verified source patch matchesbeb9db2(patch SHA256203920258405bf9454d0904906faf0840a963556da14320b5825c1fc94a11310). 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
Unitexpression 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-gatepassed. 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 ofbeb9db2is 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 on4205232was 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 tobeb9db2, merged as5fa8356.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.
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.
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
91067e3at 320 CSS px; the iOS build is2358cffat 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.
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.