Repository navigation
fix(mobile): Android composer picker scrolls past the first four rows - #15856
Conversation
ApprovabilityVerdict: Not approved Macroscope's review found this PR not approvable — This Android fix introduces new popover hosting, coordinate measurement, and composer-layout behavior across multiple production components. An unresolved Medium-severity finding concerns stale picker visibility and interaction when the composer is hidden, so the change needs human review. Not approved because:
Adjust the Minimum Blocking Severity for this repo — including turning it Off — in Settings. You can add or adjust custom eligibility rules. Learn more. |
Thread transfer impact✅ Thread transfer remains within every enforced ceiling.
Baseline: Scenario and decoded snapshot size10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.
Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed. |
Dismissing prior approval to re-evaluate b85d6d1
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configuration
📒 Files selected for processing (3)
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 5 remain after this review. 📝 WalkthroughWalkthroughThe change adds a host for composer popover content and an anchor for positioning it. ThreadDetailScreen provides the host, and ThreadComposer uses the anchor for ComposerCommandPopover. On Android, the anchor measures its position relative to the host and updates the popover position. ChangesComposer popover hosting and anchoring
Priority: ➖ Normal Estimated code review effort: 3 (Moderate) | ~20 minutes Change: Bug fix · Severity of issue fixed: Medium Merge Risk: ⚪ Minimal · up to No actionable issue remains before merge under normal checks. Android gesture delivery has not been independently verified at runtime. Security Architecture ReviewSecurity architecture risk: ⚪ Minimal · up to The change relocates the Android picker without changing command-selection permissions or thread binding. Each screen owns its picker state, and closing the picker clears the hosted content. No material security risk was identified in this change. Retained concerns Security review detailsSecurity Blast Radius
Trust Boundaries and Controls
Resilience and Maintainability Implications
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 Generate unit tests (beta)
Comment |
Dismissing prior approval to re-evaluate 9e603f9
Dismissing prior approval to re-evaluate 80e96b6
Dismissing prior approval to re-evaluate d7c8378
d7c8378 to
bd654f7
Compare
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…e keyboard settles Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… composer The overlay portal sat outside the keyboard transform, so the picker had to be re-measured on keyboard events and landed in the wrong place. Render it into a full-size host inside the composer's KeyboardStickyView instead, which moves with the keyboard and still covers the picker so Android delivers its scrolls. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
bd654f7 to
375a54d
Compare
| // re-project after every render. | ||
| useEffect(() => { | ||
| measure(); | ||
| host?.setContent( |
There was a problem hiding this comment.
🟡 Medium threads/ComposerPopoverAnchor.android.tsx:40
When ThreadDetailScreen hides the composer with display: "none", an already-open picker remains visible and interactive over the questionnaire or failure UI. This effect keeps setting the picker on ComposerPopoverHost, which is outside the hidden subtree; clear or suppress the host content when the composer is hidden.
🚀 Reply "fix it for me" or copy this AI Prompt for your agent:
In file @apps/mobile/src/features/threads/ComposerPopoverAnchor.android.tsx around line 40:
When `ThreadDetailScreen` hides the composer with `display: "none"`, an already-open picker remains visible and interactive over the questionnaire or failure UI. This effect keeps setting the picker on `ComposerPopoverHost`, which is outside the hidden subtree; clear or suppress the host content when the composer is hidden.
A pending question or a failed creation hides the composer with display none. The picker now lives outside the composer's subtree, so it stayed on screen. The host hides its popovers on the same condition. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
## What's Changed * feat(models): add Claude Haiku 5.5 and retire Sonnet 5 and Opus 5 to legacy by @juliusmarminge in pingdotgg/t3code#16903 * fix(web): iPhone Duo folds animate, center on the hinge, and keep the phone's orientation by @gabrielelpidio in pingdotgg/t3code#16885 * fix(server): Claude 5-series models always run 1M context by @juliusmarminge in pingdotgg/t3code#16908 * fix(desktop): setup prompts name a t3 that runs on desktop installs by @juliusmarminge in pingdotgg/t3code#16676 * feat(desktop): install the t3 command from Settings by @juliusmarminge in pingdotgg/t3code#16683 * fix(web): show live names in thread-read activity by @Bil0000 in pingdotgg/t3code#13140 * feat(mobile): adopt v5 navigation and native iPad columns by @juliusmarminge in pingdotgg/t3code#16733 * fix(mobile): Android composer picker scrolls past the first four rows by @shivamhwp in pingdotgg/t3code#15856 * fix(desktop): sign-in and captchas work again in desktop browser tabs by @juliusmarminge in pingdotgg/t3code#16939 * fix(server): missing project folders no longer log favicon warnings by @yordis in pingdotgg/t3code#16757 * fix(server): unload Codex threads left idle on the shared app-server by @RhysSullivan in pingdotgg/t3code#16917 * fix(web): fast typing no longer scrambles text when type-to-focus kicks in by @otavio in pingdotgg/t3code#14595 * fix(web): simplify workspace card rows by @Bil0000 in pingdotgg/t3code#16823 * fix(web): Copy MCP URL shows up for environments reached over plain http by @SunkenInTime in pingdotgg/t3code#16909 * fix(web): C#, Java, PHP and 11 other languages get file icons by @juliusmarminge in pingdotgg/t3code#16974 * feat(clients): live row shows the agent's latest thought by @t3dotgg in pingdotgg/t3code#16284 * feat(web): block-level Markdown in the rich text composer by @chrisdeeming in pingdotgg/t3code#14677 * fix(web): center project monograms in settled rows by @Aforno in pingdotgg/t3code#16841 * fix(web): cancelling a new citation no longer leaves a stray space by @Aforno in pingdotgg/t3code#16828 * fix(settings): provider updates show live progress instead of a bare spinner by @shivamhwp in pingdotgg/t3code#16958 * feat(web): find in diffs with Cmd+F by @juliusmarminge in pingdotgg/t3code#14623 * refactor(server): GitHub services are named for the API they call, not gh by @juliusmarminge in pingdotgg/t3code#16967 * refactor(server): GitHub GraphQL batches use variables and share one pager by @juliusmarminge in pingdotgg/t3code#16960 * refactor(server): GitHub source control reads GitHubApi directly by @juliusmarminge in pingdotgg/t3code#16982 * refactor(server): GitHub rate limits read the response headers by @juliusmarminge in pingdotgg/t3code#16986 ## New Contributors * @RhysSullivan made their first contribution in pingdotgg/t3code#16917 * @Aforno made their first contribution in pingdotgg/t3code#16841 **Full Changelog**: pingdotgg/t3code@v0.0.46-nightly.20261007.2787...v0.0.46-nightly.20261008.2801 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.46-nightly.20261008.2801
## What's Changed * feat(models): add Claude Haiku 5.5 and retire Sonnet 5 and Opus 5 to legacy by @juliusmarminge in pingdotgg/t3code#16903 * fix(web): iPhone Duo folds animate, center on the hinge, and keep the phone's orientation by @gabrielelpidio in pingdotgg/t3code#16885 * fix(server): Claude 5-series models always run 1M context by @juliusmarminge in pingdotgg/t3code#16908 * fix(desktop): setup prompts name a t3 that runs on desktop installs by @juliusmarminge in pingdotgg/t3code#16676 * feat(desktop): install the t3 command from Settings by @juliusmarminge in pingdotgg/t3code#16683 * fix(web): show live names in thread-read activity by @Bil0000 in pingdotgg/t3code#13140 * feat(mobile): adopt v5 navigation and native iPad columns by @juliusmarminge in pingdotgg/t3code#16733 * fix(mobile): Android composer picker scrolls past the first four rows by @shivamhwp in pingdotgg/t3code#15856 * fix(desktop): sign-in and captchas work again in desktop browser tabs by @juliusmarminge in pingdotgg/t3code#16939 * fix(server): missing project folders no longer log favicon warnings by @yordis in pingdotgg/t3code#16757 * fix(server): unload Codex threads left idle on the shared app-server by @RhysSullivan in pingdotgg/t3code#16917 * fix(web): fast typing no longer scrambles text when type-to-focus kicks in by @otavio in pingdotgg/t3code#14595 * fix(web): simplify workspace card rows by @Bil0000 in pingdotgg/t3code#16823 * fix(web): Copy MCP URL shows up for environments reached over plain http by @SunkenInTime in pingdotgg/t3code#16909 * fix(web): C#, Java, PHP and 11 other languages get file icons by @juliusmarminge in pingdotgg/t3code#16974 * feat(clients): live row shows the agent's latest thought by @t3dotgg in pingdotgg/t3code#16284 * feat(web): block-level Markdown in the rich text composer by @chrisdeeming in pingdotgg/t3code#14677 * fix(web): center project monograms in settled rows by @Aforno in pingdotgg/t3code#16841 * fix(web): cancelling a new citation no longer leaves a stray space by @Aforno in pingdotgg/t3code#16828 * fix(settings): provider updates show live progress instead of a bare spinner by @shivamhwp in pingdotgg/t3code#16958 * feat(web): find in diffs with Cmd+F by @juliusmarminge in pingdotgg/t3code#14623 * refactor(server): GitHub services are named for the API they call, not gh by @juliusmarminge in pingdotgg/t3code#16967 * refactor(server): GitHub GraphQL batches use variables and share one pager by @juliusmarminge in pingdotgg/t3code#16960 * refactor(server): GitHub source control reads GitHubApi directly by @juliusmarminge in pingdotgg/t3code#16982 * refactor(server): GitHub rate limits read the response headers by @juliusmarminge in pingdotgg/t3code#16986 ## New Contributors * @RhysSullivan made their first contribution in pingdotgg/t3code#16917 * @Aforno made their first contribution in pingdotgg/t3code#16841 **Full Changelog**: pingdotgg/t3code@v0.0.46-nightly.20261007.2787...v0.0.46-nightly.20261008.2801 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.46-nightly.20261008.2801
On Android, the composer pickers in an open thread (
@files,$skills,/commands,#) showed four rows and wouldn't scroll, so anything past the fourth result was unreachable. Taps worked. Swipes went to the chat behind the picker instead.The picker hung above the composer with
absolute bottom-full, outside its parent's bounds. Android only sends drags to views inside their parent's bounds, so the picker's list never got the swipe.On Android the picker now renders into
ComposerPopoverHost, a full-size layer inside the composer'sKeyboardStickyView. That layer covers the picker, so Android delivers its swipes, and it moves with the keyboard, so the picker stays right above the composer without any keyboard timing. The anchor re-measures the composer's resting position withmeasureLayoutagainst the host after each composer render, and when the composer or the host resizes. iOS keeps the old wrapper.Testing
Xiaomi POCO M3 Pro, Android 13, dev build of this branch on current
main. Same steps in both videos: type$, swipe up three times inside the skills list, swipe down twice, close the keyboard, swipe once more.The before video runs the old wrapper on the same build. I confirmed which code was live from the view tree each time: the old wrapper squeezes the list into a 22px strip inside the composer, and the fix gives it its full height. Mobile typecheck and lint on the changed files pass. iOS isn't tested since that path is unchanged.
A pending question card or a failed-creation card replaces the composer with
display: "none". The picker now lives outside the composer, so the host also hides it on that same condition. I checked this on the phone with a temporary, uncommitted timer that flips that state while the picker is open:Closes #15658
🤖 Generated with Claude Code