Repository navigation
fix(mobile): Android feed stays at its end after the keyboard or sidebar changes - #33611
Merged
Merged
Conversation
Contributor
ApprovabilityVerdict: Approved at Macroscope's review found this PR approvable — This adjusts Android thread-feed inset and focus scrolling to preserve end-following when the keyboard or sidebar changes. Its effects are limited to feed presentation, with no persistent-data or access changes. Notes:
You can add or adjust custom eligibility rules. Learn more. |
macroscopeapp
Bot
dismissed
their stale review
November 10, 2026 00:28
Dismissing prior approval to re-evaluate 8faf945
juliusmarminge
force-pushed
the
t3code/android-feed-end
branch
2 times, most recently
from
November 10, 2026 01:38
926f4cd to
8345cdb
Compare
Contributor
|
🚀 Expo continuous deployment is ready!
|
macroscopeapp
Bot
dismissed
their stale review
November 10, 2026 01:53
Dismissing prior approval to re-evaluate 8345cdb
…bar changes On Android the thread feed passed the composer height as a static contentInset. Legend List 3.7.2 ignores that prop off iOS, and its KeyboardAwareLegendList subtracts it from every padding report from KeyboardChatScrollView, so the list was told the composer padding was 0. Every end target (first open, keyboard settle, sidebar width hold) landed one composer height short of the native end. Drop the Android-only static inset. The list already seeds the composer inset when it attaches, so the first open still lands above the composer. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… the feed end A tap on selectable message text moves focus from the composer to that TextView, and Android's ScrollView scrolls a newly focused child into view. For a reply taller than the viewport that is a large native scroll with no drag, which Legend List treats as a user scroll, so it stops following the end before the keyboard inset shrinks. Taps on empty space take no focus and kept the end. Turn off scrollsChildToFocus on the feed. It is Android-only, so iOS is unchanged, and text selection still works. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
juliusmarminge
force-pushed
the
t3code/android-feed-end
branch
from
November 10, 2026 01:54
8345cdb to
fd7e211
Compare
Contributor
github-actions Bot
added a commit
to omarcresp/t3code-flake
that referenced
this pull request
Nov 10, 2026
**v0.1.9-nightly.20261110.4452** · 15 changes from 4 contributors - **Background command details.** Inspect background commands, their status and captured output, and navigate to their subagents. - **Requested page changes.** Agents can make changes through page tools when you ask them to. - **Expanded image navigation.** Pan zoomed images and Mermaid diagrams using a trackpad or mouse wheel. - **Antigravity usage pricing.** Usage recognizes more Antigravity models and prices their token usage more accurately. ### Plus 8 more bug fixes. <details> <summary>Full changelog</summary> ## What's Changed * fix(web): new threads use the last used project by @Yash-Singh1 in pingdotgg/t3code#33626 * fix(mobile): distinguish local ACP instances by name by @shivamhwp in pingdotgg/t3code#32467 * ci(mobile): dev clients build on Blacksmith, and mobile:install starts that build by @juliusmarminge in pingdotgg/t3code#33617 * fix(mobile): Android sidebar and composer transitions no longer reflow at rest by @juliusmarminge in pingdotgg/t3code#33599 * fix(server): price Antigravity Gemini Flash effort variants by @Ephraim-9 in pingdotgg/t3code#13809 * fix(mobile): Android feed stays at its end after the keyboard or sidebar changes by @juliusmarminge in pingdotgg/t3code#33611 * fix(server): Antigravity install no longer fails on a stale Windows Crashpad pipe by @juliusmarminge in pingdotgg/t3code#26374 * ci(mobile): Android PR preview clients build on Blacksmith by @juliusmarminge in pingdotgg/t3code#33618 * fix(web): scrolling pans expanded images and Mermaid diagrams by @shivamhwp in pingdotgg/t3code#26630 * fix(desktop): agents see visible:true while the desktop shows their tab by @shivamhwp in pingdotgg/t3code#23589 * fix(server): allow requested WebMCP writes by @shivamhwp in pingdotgg/t3code#26570 * fix(antigravity): resolve model names from usage metadata by @Yash-Singh1 in pingdotgg/t3code#33661 * fix(web): show details for background commands by @Yash-Singh1 in pingdotgg/t3code#33647 * fix(ci): store-build checkouts drop credentials without submodule cleanup by @juliusmarminge in pingdotgg/t3code#33664 * fix(web): "Use T3 Code in another app" opens the Grok Bot app by @juliusmarminge in pingdotgg/t3code#33663 **Full Changelog**: pingdotgg/t3code@v0.1.9-nightly.20261110.4449...v0.1.9-nightly.20261110.4452 </details> Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.1.9-nightly.20261110.4452
AdEx-Partners-DE
added a commit
to AdEx-Partners-DE/t3code
that referenced
this pull request
Nov 10, 2026
Integrates 15 upstream commits (nightly 4449 to 4452) with one conflict in a generated file: background commands show their details (pingdotgg#33647), Antigravity model names from usage metadata (pingdotgg#33661), Gemini Flash effort pricing (pingdotgg#13809) and an install that no longer fails on a stale Windows Crashpad pipe (pingdotgg#26374), WebMCP writes on request (pingdotgg#26570), agents see visible:true while the desktop shows their tab (pingdotgg#23589), scrolling pans expanded images and Mermaid diagrams (pingdotgg#26630), "Use T3 Code in another app" opens the Grok Bot app (pingdotgg#33663), new threads use the last used project, and mobile and CI fixes (pingdotgg#33611, pingdotgg#33599, pingdotgg#32467, pingdotgg#33664, pingdotgg#33618, pingdotgg#33617). No dependency file changed. No fork feature was added or dropped. The conflict is apps/server/src/provider/agentContextBudget.json, the measured agent context size: upstream lowered its three values by 2, 2 and 16 bytes, and the fork's mcpToolListJsonBytes was larger (52804 instead of 48233). Resolved as 5547 / 7277 / 52788 (both changes added); AgentContextBudget.test.ts confirms that the measured sizes equal these values. check:changed against the pre-merge HEAD (74 files) passes in every step: format, lint, knip, graphql, the typecheck of 41 packages, 40 test files, node --test and the react compiler check. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2 tasks done
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stacked on https://git.cafe/pingdotgg/t3code/pulls/33599 (
t3code/android-workspace-sequencing), so one build tests both.Problem
On Android, start at the true end of a long thread. Focusing the composer, or toggling the sidebar once, leaves the feed short of the end: the last reply and its timestamp footer stay under the composer, even after the keyboard closes. Opening a thread also landed short. iOS was fine.
Cause
ThreadFeedpassed the composer height as a staticcontentInseton Android only (added in https://git.cafe/pingdotgg/t3code/pulls/5585 to seed the first open). Under Legend List 3.7.2 that prop now works against us twice:getContentInsetEnd) ignoresprops.contentInsetoff iOS, and RN's Android ScrollView has nocontentInset.KeyboardAwareLegendListsubtracts the staticcontentInset.bottomfrom every padding report fromKeyboardChatScrollViewon non-iOS.So Legend was told the composer padding was
92 − 92 = 0. The native scroll view still pads by the composer height, which puts the true end one composer height past where Legend thinks it is. Every end target came out short by that amount: initial open, keyboard settle, and the width-change end hold from https://git.cafe/pingdotgg/t3code/pulls/33459. Instrumented emulator logs before the fix: Legend's end was2877, the native end reached by swiping was2969, and the reported inset was0. After the fix both are2969, with an inset of92.Change
Drop the Android-only static inset (
deriveThreadFeedInitialContentInsetand its test). The list already reports the live composer inset when it attaches (attachList), which covers the first open and remounts. iOS is unchanged: the helper always returnedundefinedthere.Verification
Local
Pixel_10_Pro_Foldemulator (unfolded, Gboard), dev build, isolated backend, seeded replay thread. The same script ran before (https://git.cafe/pingdotgg/t3code/pulls/33599 head c82a436) and after. Frames left to right: true end, keyboard open, keyboard closed, true end again, sidebar collapsed, sidebar expanded.Before: after the keyboard opens or the sidebar changes, step 24's reply and its footer stay hidden under the composer.
After: the last reply and its footer stay visible in every state.
Recordings (1.5×, feed column only):
There's no test. The bug is in how two Legend modules disagree about a prop, so the only test available would mirror mock calls; the recordings are the proof. The iOS code path doesn't change.
vp run check:changedpasses.Follow-up: dismissing the keyboard by tapping message text
Problem. Testing on the Fold: with the keyboard open at the end of a thread, tapping the empty area to dismiss kept the end, but tapping a message's text left the feed scrolled up.
Cause. Message text is a natively selectable TextView. A tap on it moves focus from the composer to that TextView, and React Native's Android ScrollView scrolls a newly focused child into view (
requestChildFocus→scrollToChild). For a reply taller than the viewport, that's a large native scroll with no drag. Logs on the emulator: the offset jumped 833 → 376 right after the tap, before any inset change, and Legend'supdateScrolltreated it as a user scroll (interruptMaintainScrollAtEnd). End following was therefore off when the keyboard inset shrank. Taps on empty space take no focus, so they kept the end. Both paths run the same dismiss code (onTouchEnd→blur()), and neither starts a drag, which rules out the other two hypotheses. A short reply that's fully on screen doesn't need a scroll, so it only shows with replies taller than the visible area.Change.
scrollsChildToFocus={false}on the feed list. It's an Android-only ScrollView prop, so iOS is unchanged. Long-press text selection still works.Verification. Same emulator, a seeded thread whose last reply is taller than the viewport, and a keyboard-open tap on the reply's text or on the blank footer row. Frames: text tap with keyboard open, after; blank tap with keyboard open, after.
Before (eaea60b): the text tap leaves the feed on Paragraphs 5–11, while the blank tap keeps Paragraph 14 and its footer.
After (8faf945): both taps keep Paragraph 14 and its footer above the composer.
Long-press selection still works after the change:
Stack update: tested on the Fold
Rebased onto https://git.cafe/pingdotgg/t3code/pulls/33599's new head (5965c6c), where the sidebar stays put while the keyboard is up and the thread header keeps its height while typing. That removes the mid-history reflow reported on the Fold: the pane width no longer changes with the keyboard, so rows don't re-wrap when the keyboard opens or closes. The two commits here are unchanged.
Full stack on the physical Galaxy Z Fold (dev client, seeded thread whose last reply is taller than the viewport, sidebar titles blurred). Frames: at the end; keyboard open; keyboard closed; text-tap dismiss; sidebar collapsed; sidebar expanded. Each one keeps the last paragraph and its footer above the composer. With the keyboard up, the sidebar stays.
Mid-history, pressing the feed with the keyboard open or closed didn't move it in any run (offset stable within a few px, no end-following interrupt). The keyboard-open mid-history case is in https://git.cafe/pingdotgg/t3code/pulls/33599.
🤖 Generated with Claude Code