Skip to content

fix(mobile): keep Android follow-up menus visible above the keyboard - #29225

Open
shivamhwp wants to merge 3 commits into
mainfrom
issue-watch/29201
Open

shivamhwp wants to merge 3 commits into
mainfrom
issue-watch/29201

Conversation

@shivamhwp

@shivamhwp shivamhwp commented Nov 2, 2026 •

Copy link
Copy Markdown
Collaborator

Closes / Refs

Closes #29201

What's fixed

With the Android keyboard open, the follow-up menu could show only the first heading and checkmark, clipping both descriptions and the Queue option. The fade now runs on a fixed-size wrapper so the menu can grow when its native content finishes measuring. This is a focused fix for the existing menu's layout.

Evidence

POCO F4, Android 14, using T3 Code Dev with native fingerprint 971743703b097b8870b39ff842d130f50b115eeb. After captures use cca47d7f4d0fc08ba040c9f09a7e48beaaea99dc; the baseline is 47f2c8d29e981c7723467efe137ee19e91df924e. Final head 1d1c87c12b28015410639499c2b00980101f916c changes only a code comment after these captures.

Before: the menu is clipped while the keyboard is open.

Before, keyboard open

After: both options and descriptions are fully visible with the keyboard open.

After, keyboard open

Android: open the menu with the keyboard visible and select Queue with one tap.

after-interaction.mp4

Follow-up verification on the final head

All recordings below ran on physical corex phones with the exact clean checkout 1d1c87c12b28015410639499c2b00980101f916c (tree f0bf959fbfd8f0d7ce15d56d6383ce0ab7729b45), T3 Code Dev native fingerprint 971743703b097b8870b39ff842d130f50b115eeb, and Metro serving this checkout. The isolated backend used the free Replay provider; no paid agent was needed.

  • POCO F4 (22021211RI), Android 14: Gboard, an alternate to the original Emoji&Font keyboard. Both headings and descriptions display above the open keyboard; selecting Queue accepts the draft on the first tap.
f4-gboard.mp4
  • Same F4 and head, constrained height: enlarged Gboard, system font scale 1.4, enlarged app text, and 540 dpi display override. At the tightest point the keyboard starts at y=688 on the 1080×2400 display. Open the follow-up menu, scroll its content to bring Queue and its description into view, and select Queue. The draft clears and appears pending. Refocus the composer, open the menu again, select Steer now; the draft clears and the pending count increases. The Replay fixture serializes follow-ups; this verifies menu dispatch, not provider interruption semantics. Original display/text/keyboard settings are restored after testing.
f4-constrained.mp4
  • POCO M3 Pro 5G (M2103K19PI), Android 13: same head and native fingerprint, Gboard open. Both options and descriptions display; Steer now and Queue each accept a draft. The recording ends with two queued messages. This is the second Android version requested by evidence review.
m3-android13.mp4

Local validation

Correction to the earlier report: there are six React Compiler checks total, comprising the changed menu's compile case and five broader checks. There were not six additional cross-file tests. No test was added for this visual fix; the captures prove it.

vp run check:changed passed on the head and tree above. Its exact captured output follows (affected package typechecks reused passing Vite+ cache entries):

check:changed command and passing output
Command: vp run check:changed
1d1c87c12b28015410639499c2b00980101f916c
f0bf959fbfd8f0d7ce15d56d6383ce0ab7729b45
$ node scripts/check-changed.ts ⊘ cache disabled
check:changed: 1 files since 47f2c8d29e98 (origin/main)

> vp format  pass  0.3s
Checking formatting...

All matched files use the correct format.
Finished in 186ms on 1 files using 16 threads.

> vp lint  pass  0.7s

> vp knip 1/2  pass  9.8s

> vp knip 2/2  pass  20.4s

> vp typecheck (2 packages)  pass  0.4s
~/apps/mobile$ tsc --noEmit ◉ cache hit, replaying

~/scripts$ tsc --noEmit ◉ cache hit, replaying

---
vp run: 2/2 cache hit (100%), 2/2 successful, 3.08s saved. (Run `vp run --last-details` for full details)

> vp react compiler (1 files)  pass  17.4s

 RUN  v5.0.5 /home/shivam/Developer/.state/issue-watch/worktrees/29201


 Test Files  1 passed (1)
      Tests  6 passed | 1006 skipped (1012)
   Start at  10:02:31
   Duration  14.13s (tests 50%, transform 34%, setup 9%, import 7%)

check:changed summary
  pass  format  0.3s
  pass  lint  0.7s
  pass  knip 1/2  9.8s
  pass  knip 2/2  20.4s
  pass  typecheck (2 packages)  0.4s
  pass  react compiler (1 files)  17.4s
  CI also runs: full test suites
  unused patch check skipped: no dependency files changed

The same six compiler checks were also run with verbose output on the clean final head. Exact command, all passing case names, and result:

Six React Compiler checks
corex, 2026-11-02 UTC
$ git rev-parse HEAD
1d1c87c12b28015410639499c2b00980101f916c
$ git rev-parse HEAD^{tree}
f0bf959fbfd8f0d7ce15d56d6383ce0ab7729b45
$ git status --porcelain
$ vp test run apps/mobile/src/reactCompilerCoverage.test.ts -t "compiles src/components/ui/AndroidAnchoredMenu\.tsx$|^(?!.*compiles )" --reporter=verbose
 ✓ |@t3tools/mobile (unit)| src/reactCompilerCoverage.test.ts > React Compiler coverage > Metro's transformer applies the compiler 4391ms
 ✓ |@t3tools/mobile (unit)| src/reactCompilerCoverage.test.ts > React Compiler coverage > compiles src/components/ui/AndroidAnchoredMenu.tsx 443ms
 ✓ |@t3tools/mobile (unit)| src/reactCompilerCoverage.test.ts > React Compiler coverage > caches the thread feed derivation 3930ms
 ✓ |@t3tools/mobile (unit)| src/reactCompilerCoverage.test.ts > React Compiler coverage > caches the new-task model options and host environments 1292ms
 ✓ |@t3tools/mobile (unit)| src/reactCompilerCoverage.test.ts > React Compiler coverage > registers the workspace inspector only when its renderer changes 1770ms
 ✓ |@t3tools/mobile (unit)| src/reactCompilerCoverage.test.ts > React Compiler coverage > lists only files that exist 0ms
 Test Files  1 passed (1)
      Tests  6 passed | 1006 skipped (1012)
   Start at  10:42:40
   Duration  26.11s (tests 49%, transform 34%, setup 10%, import 7%)
Exit code: 0

Earlier F4 checks also covered outside dismissal preserving draft/keyboard across three openings and the keyboard-dismissed menu. This file runs only on Android: iOS uses a separate implementation, so the device router's general mobile iOS entry does not apply. Web, desktop, providers, and wire contracts are unchanged.

Unproven: other Android releases and keyboard apps beyond the two phones and keyboards above; real-provider steer interruption was not part of this layout check.

Implemented with Claude Opus 5.5 in T3 Code; verified and reviewed with GPT-6.1 Sol in the Codex harness.

shivamhwp and others added 2 commits November 2, 2026 09:34
…d is open

With the keyboard open, the in-window anchored menu put Reanimated's FadeIn
on the menu box itself. That box grows after mount, once Compose reports the
inline menu's height. When that resize lands before the pending entering
animation starts, Reanimated starts the animation with the new frame as both
current and final, so Android's mounting layer never sends the layout update.
The box stays at its first-commit size: the 24dp checkmark plus padding.

Move the fade onto a fixed-size, touch-transparent wrapper so the menu box
resizes normally.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels Nov 2, 2026
macroscopeapp[bot]
macroscopeapp Bot previously approved these changes Nov 2, 2026
@macroscopeapp

macroscopeapp Bot commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 5e998b3

Macroscope's review found this PR approvable — Moves the Android keyboard-open menu fade to a fixed-size wrapper so native content can resize without clipping. Existing menu actions and defaults remain unchanged, with device verification supporting the limited presentation risk.

You can add or adjust custom eligibility rules. Learn more.

@coderabbitai

coderabbitai Bot commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

No actionable comments were generated in the recent review.

Walkthrough

When the Android anchored menu is visible with the keyboard open, an animated wrapper fades in over 120 ms. The inner menu retains its existing sizing, positioning, and scroll behavior.

Changes: Android menu layout

Layer / File(s) Summary
Separate wrapper and menu layout
apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx
The keyboard-visible menu now uses a full-screen wrapper with a 120 ms fade-in animation. The inner view retains the menu’s existing sizing, positioning, and scroll behavior.

Estimated code review effort: 2 (Simple) | ~10 minutes

Change: Bug fix · Severity of issue fixed: Low

Suggested reviewers: juliusmarminge, maria-rcks

Merge Risk: Minimal · up to 5e998

No actionable merge-blocking risk is established.

Pre-merge checks: Passed 4
Check name Status Explanation
Title check Passed The title names the fix (keeping Android follow-up menus visible above the keyboard) and the affected area (mobile). The raw summary says the menu now sits in a full-screen, pointer-events-transparent…
Description check Passed The description follows the repository template. It has Problem, Change, Scope and approval, and Verification sections, plus a conventional-commit-style title. The Problem section explains the clipped…
Linked Issues check Passed Issue [#29201] is closed. It is historical context only, but its described bug is a valid coding requirement for this PR: the Android follow-up menu must stay fully visible and usable with the keyboar…
Out of Scope Changes check Passed The whole-PR summary lists one changed file, apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx (+40/-33). The whole-PR file diff shows only the change to the Android menu wrapper. It adds the Rean…
Full details: Title check

Explanation

The title names the fix (keeping Android follow-up menus visible above the keyboard) and the affected area (mobile). The raw summary says the menu now sits in a full-screen, pointer-events-transparent wrapper with a fixed-size fade-in, which addresses the clipping the title describes. The title is specific, follows conventional commit form, and is a single sentence.

Full details: Description check

Explanation

The description follows the repository template. It has Problem, Change, Scope and approval, and Verification sections, plus a conventional-commit-style title. The Problem section explains the clipped menu with the keyboard open. The Change section explains the fixed-size wrapper. Verification gives device captures, recordings, and command output on specific phones. The Scope and approval section links issue #29201 and says the change is a focused fix of an obvious layout bug. The author does not paste an explicit maintainer approval comment, so that part is thin. The description is mostly complete, so it passes.

Full details: Linked Issues check

Explanation

Issue [#29201] is closed. It is historical context only, but its described bug is a valid coding requirement for this PR: the Android follow-up menu must stay fully visible and usable with the keyboard open, including both options (Steer now, Queue) and their descriptions. Whole-PR diff of apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx: the menu's fade (Animated.View with FadeIn.duration(120), pointerEvents="box-none", className "absolute inset-0") now wraps the positioned container. The positioned container keeps left, maxHeight, width, borderRadius, and top/bottom placement. Its ScrollView keeps keyboardShouldPersistTaps="always". This separates the fade from the sized container, so the menu can resize after Compose measurement. Incremental diff of this file from previous reviewed head 1d1c87c to 5e998b3 is empty, so the code that the previous assessment reviewed is unchanged. The PR reports Android device captures on POCO F4 (Android 14) and POCO M3 Pro 5G (Android 13) at 1d1c87c, with the keyboard open and both options visible. No automated test was added. The issue does not require one. Residual uncertainty: the incremental diff for the whole PR since 1d1c87c exceeded the inspection buffer, so changes in other paths since the previous review could not be read. Device captures were recorded at 1d1c87c, not at 5e998b3.

Full details: Out of Scope Changes check

Explanation

The whole-PR summary lists one changed file, apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx (+40/-33). The whole-PR file diff shows only the change to the Android menu wrapper. It adds the Reanimated Animated and FadeIn import and moves the existing menu container under a fade wrapper. It does not change menu content, actions, placement logic, or other product behavior. This change supports [#29201]. The PR description states that web, desktop, providers, and wire contracts are unchanged. Residual uncertainty: the incremental diff from 1d1c87c to 5e998b3 across all paths exceeded the inspection buffer. The file-level incremental diff is empty. Scope for other paths since the previous review rests on the whole-PR summary.

Finishing Touches
Generate docstrings
  • Commit to this branch
  • Create a new PR
Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts
Recent review info
Run configuration
Commits

Reviewing files that changed from the base of the PR and between 1d1c87c and 5e998b3.

Files selected for processing: 1
  • apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 6 remain after this review.

@maria-rcks

maria-rcks commented Nov 2, 2026 •

Copy link
Copy Markdown
Collaborator

Note

Written by gpt-6.1-sol on behalf of Maria

Verified on Android emulator (API 35) against a real dev server

Verified head 1d1c87c12b28015410639499c2b00980101f916c on AVD t3, using T3 Code Dev native fingerprint 971743703b097b8870b39ff842d130f50b115eeb, Metro from the PR checkout, and an isolated dev backend. Created a real project through the app and ran real Codex gpt-6.1-sol turns through the local proxy. No mocks or Replay data.

With Gboard open, long-pressing Steer showed both options and both descriptions above the keyboard. Queue accepted the draft with one tap and displayed 1 queued while the real turn continued. Selecting Steer now delivered the next message to the active turn, which replied steer-ok; the queued follow-up subsequently replied queued-ok. Outside dismissal preserved the draft and keyboard, and reopening worked. The keyboard-dismissed menu also displayed both options.

Baseline menu file from 47f2c8d29e981c7723467efe137ee19e91df924e, with a real running turn and Gboard open. Clipping did not reproduce in this attempt:

Baseline menu with Gboard open

Exact PR menu with both descriptions visible above Gboard:

PR menu with Gboard open during a real Codex turn

Recording of opening the menu and selecting Queue, followed by 1 queued:

Android menu Queue interaction

At the original verification head, no source changes were needed and GitCafe reported 29 successful checks.

Not verified

  • iOS cannot run on this Linux VM.
  • Original clipping was not reproduced with the baseline menu file; this confirms the PR behavior on API 35, not a reproduced before/after failure.
  • Other Android versions, keyboards, and constrained-height configurations.
  • Uploaded video playback in the collaborative browser: the player did not load metadata. The recording decoded successfully and its frames were inspected; browser playback remains unverified.

merge conflict resolution

Merged current main 7c22e24e3fa1 into this branch without rebasing, producing 5e998b3bc805b7b888ac8c6ffe087ca744bb3a46. Main removed the entering animation from the resizable menu to avoid the same Compose measurement failure. Kept this PR's fixed-size, touch-transparent fade wrapper, which leaves the menu free to resize. The menu file is byte-identical to the previously verified PR head. No unrelated product changes.

Blacksmith vp run check:changed 7c22e24e3fa1a3bb3a95f27aea000067f198fe7f passed formatting, lint, both knip passes, affected typechecks, and six selected React Compiler tests. Two independent source reviews found no blockers.

The Android evidence above belongs to the original head. Native verification of the merged head remains unverified because device access is disabled in this environment. Browser verification cannot exercise this native Android/Compose menu.

@macroscopeapp
macroscopeapp Bot dismissed their stale review November 3, 2026 22:55

Dismissing prior approval to re-evaluate 5e998b3

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XS 0-9 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Android: Steer now / Queue menu is clipped when the keyboard is open

2 participants