feat(mobile): show project favicons in the thread filter menu - #11370
SunkenInTime wants to merge 2 commits into
Conversation
The Project submenu of the Android thread filter listed projects by name only. Give the Android menu an optional leading node per action and pass the existing ProjectFavicon there, carrying a representative project on each scope so the favicon lookup has what it needs. The node is stripped before the iOS native menu bridge, which only takes symbol names. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
ApprovabilityVerdict: Approved at Macroscope's review found this PR approvable — This is a small, localized Android UI enhancement that reuses the existing favicon loader and fallback while preserving menu selection behavior and iOS native-menu handling. It introduces no schema, deployment, security, billing, default, or static-analysis changes. You can add or adjust custom eligibility rules. Learn more. |
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Advanced Run ID: 📒 Files selected for processing (6)
Included review availability: Your plan provides up to 10 included reviews per hour; 9 remain after this review. 📝 WalkthroughWalkthroughMobile project filter menus now support representative project favicons. Android menu actions accept leading React nodes, while native menu actions strip them during conversion. ChangesProject menu icons
Priority: ⬇️ Low Estimated code review effort: 3 (Moderate) | ~20 minutes Change: Feature Suggested reviewers: Sequence Diagram(s)sequenceDiagram
participant HomeRouteScreen
participant HomeHeader
participant AndroidAnchoredMenu
participant ProjectFavicon
HomeRouteScreen->>HomeHeader: provide projectFilterOptions with representative
HomeHeader->>AndroidAnchoredMenu: provide project menu actions
AndroidAnchoredMenu->>ProjectFavicon: render leading favicon
AndroidAnchoredMenu-->>HomeHeader: handle selected action
sequenceDiagram
participant ControlPillMenu
participant toNativeMenuActions
participant ThemedMenuView
ControlPillMenu->>toNativeMenuActions: convert AndroidMenuAction[]
toNativeMenuActions-->>ControlPillMenu: return native MenuAction[]
ControlPillMenu->>ThemedMenuView: provide converted actions
Merge Risk: ⚪ Minimal · up to Project icons are added to Android project menus while iOS continues receiving native-compatible menu actions. No merge-blocking risk was identified. 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
Fixes reproduced on an Android emulator and from upstream reports. Feed: Android stops drawing a text view past the GPU's maximum texture height, so a long list rendered as one selectable Text lost its tail and took seconds per frame to draw. Long lists now split into 40-item chunks. Wide assistant markdown blocks keep a pinned width; the feed reserves bottom padding. Keyboard: the feed re-pins after keyboard transitions settle and when the composer collapses; the back gesture collapses the composer; sticky composers only follow the keyboard after a fresh show or real focus (upstream pingdotgg#8212). Terminal: hardware Enter no longer moves focus off the terminal; keyboards that use deleteSurroundingText (FUTO) send Backspace; forward delete works. Also: stream haptics no longer buzz every 320ms on Android and all haptics use the system engine; thread settings apply on tap without Save; typed pairing codes are normalized to the server format; non-git projects fall back to the current checkout instead of a dead worktree default; user CA certificates are trusted; Ctrl/Cmd+Enter sends from a hardware keyboard; thread rename, project favicons in the filter, tablet sidebar toggle, desktop-window density, route titles, Material You review colors, bottom gesture-bar insets, and the composer placeholder clipping (upstream PRs pingdotgg#11503, pingdotgg#11370, pingdotgg#11339, pingdotgg#8200, pingdotgg#8717, pingdotgg#11445, pingdotgg#6003, pingdotgg#5052, pingdotgg#8362, pingdotgg#10709, pingdotgg#11611, pingdotgg#8800, adapted).
The native iOS menus take image sources through react-native-screens' header items, so the filter model now carries a favicon URL per project and each of the three iOS menu builders turns it into an imageSource icon: the iOS 26 mail search toolbar, the pre-26 header toolbar, and the iPad sidebar header. A shared image source pins the icon to the row's point size so UIMenu never receives a full-size favicon. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
What Changed
The Project submenu of the Android thread filter listed projects by name only, while the thread list, the new-task picker, and the web project picker (#10790) all show project favicons.
The Android menu (
AndroidAnchoredMenu) now accepts an optionalleadingnode per action and renders it before the title. The filter menu passes the existingProjectFaviconcomponent there, so loading, caching, and the folder fallback match the thread list. Each project scope option now carries its representative project, which is what the favicon lookup needs and the same representative the new-task picker already uses for grouped projects. Both builders of this menu get the icons: the phone home header and the tablet sidebar.iOS keeps its native menus and gets the icons too. All three iOS filter surfaces are built from react-native-screens header items, whose menu actions already accept an
imageSourceicon loaded through React Native's image loader. The filter model now carries a resolved favicon URL per project (useProjectScopeFaviconUrls, reading the same atomProjectFaviconuses), and each builder maps it to an icon: the iOS 26 mail search toolbar (toNativeMailSearchToolbarMenu, since that raw RNS item bypasses React Navigation's icon conversion), the pre-26NativeHeaderToolbar.MenuActionvia a newimageUriprop, and the iPad sidebar header items.menuIconImageSourcepins width, height, and scale so the loader decodes to the row's 20pt size instead of handing UIMenu a full favicon. Projects without a favicon keep no icon on iOS, which is how mixed UIMenu rows normally look. Theleadingnode stays Android-only and is stripped before the@react-native-menu/menubridge.Why
A list of ten project names is slower to scan than the same list with the icons users already recognize from the thread list. Reusing
ProjectFaviconon Android and the platform's ownimageSourcesupport on iOS keeps this a rendering change with no native patches, new state, or contract changes.Verification
imageSourcepath that header button icons already go through. Simulator screenshots to follow.TypeError: Cannot read properties of undefined (reading 'config')atdescribe), sohome-list-filter-menu.test.tscould not be run locally. The change to that module only adds an optional field.UI Changes
Same server and projects on a Pixel 8 API 36 emulator. Projects without a favicon keep the folder glyph.
Checklist
Model: Claude Fable 5.1. Harness: Claude Code in T3 Code.
🤖 Generated with Claude Code