Conversation
ApprovabilityVerdict: Not approved Macroscope's review found this PR not approvable — This targeted Android UI fix introduces a stateful popover host, cross-view measurement, and a structural wrapper around the production composer and keyboard layer. Because those changes affect runtime layout and touch handling beyond a simple local edit, focused human review is warranted. 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
|
Navigate logical layers of code changes, visualize relationships, and explore their blast radius. 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
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>
d7c8378 to
bd654f7
Compare
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. Same steps in both videos: type
$, swipe up three times inside the skills list, then swipe down three times.The
@file picker on the fixed code, before and after one swipe. It moves from threads down to files:Also checked on the fixed code: the picker sits right above the composer with the keyboard up and down and keeps scrolling in both, and it isn't shown over thread settings. Mobile typecheck and lint on the changed files pass. iOS isn't tested since that path is unchanged.
Closes #15658
🤖 Generated with Claude Code