Repository navigation
Add participant avatars to mobile conversation headers - #9369
Conversation
Co-authored-by: Terp <5856f6900e8e0a4e0ea1f4f8d2ee33e4753d2119bc122f94ecafc660b46c0511@buzz.block.builderlab.xyz> Signed-off-by: kenny lopez <[email protected]>
Co-authored-by: Terp <5856f6900e8e0a4e0ea1f4f8d2ee33e4753d2119bc122f94ecafc660b46c0511@buzz.block.builderlab.xyz> Signed-off-by: kenny lopez <[email protected]>
Codex Review Summary: ✅ CompletedThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: c0b7728090
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
🔐 Codex Security Review
Review SummaryOverall Risk: LOW
Findings[LOW]
|
…avatar-20261111 Signed-off-by: kenny lopez <[email protected]>
kalvinnchau
left a comment
There was a problem hiding this comment.
🤖 Two additional findings inline. Existing forum-inset and visible-retention findings remain applicable.
| ? null | ||
| : encodeAction(titleAvatar!, 'titleAvatar'), | ||
| 'titleAvatars': [ | ||
| for (final avatar in titleAvatars) avatar._encode('portrait'), |
There was a problem hiding this comment.
🤖 [P3] Send only the portrait presence needed by the native title
The portraits render in the Flutter overlay, while IosNavigationBar.swift:568 only needs whether titleAvatars is empty. Encoding each complete avatar into this payload makes profile/avatar changes reconfigure the native bar and tear down/recreate its floating title even though the native view consumes none of those image details. Send a presence flag or count instead. The titlePortrait circular-shape branch at line 216 is also unreachable from the current avatarActions keys and can be removed. No runtime performance impact was measured.
…ders Co-authored-by: Terp <5856f6900e8e0a4e0ea1f4f8d2ee33e4753d2119bc122f94ecafc660b46c0511@buzz.block.builderlab.xyz> Signed-off-by: kenny lopez <[email protected]>
Co-authored-by: Terp <5856f6900e8e0a4e0ea1f4f8d2ee33e4753d2119bc122f94ecafc660b46c0511@buzz.block.builderlab.xyz> Signed-off-by: kenny lopez <[email protected]>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 9611b018ff
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
🤖 Addressed the forum-inset finding in f9e5b49 (current head 9611b01): ForumPostsView receives the same title-content height as the conversation header and uses it for loading, error, and post-list insets. Extended the forum route and first-card layout tests. Full mobile suite: 4,695 passed; native iOS suite passed. The optional native portrait-payload cleanup is intentionally deferred. |
…dden Co-authored-by: Terp <5856f6900e8e0a4e0ea1f4f8d2ee33e4753d2119bc122f94ecafc660b46c0511@buzz.block.builderlab.xyz> Signed-off-by: kenny lopez <[email protected]>
…9369 - Compute the confirmed two-person pair once per channel as a value-equal record from the latest roster, including the stale-DM-metadata rule, instead of building roster sets in every message row on each emission. - Show the private-channel lock in the Android compact title pill. - Give the floated iOS title Buzz's light/dark override. Co-authored-by: studio <dc2fc481343672df31a689840c09299972e704dac592e0da6f18486646a7ee3e@buzz.block.builderlab.xyz> Co-Authored-By: Claude Opus 5.5 <[email protected]> Signed-off-by: Tom Brow <[email protected]>
Co-authored-by: Terp <5856f6900e8e0a4e0ea1f4f8d2ee33e4753d2119bc122f94ecafc660b46c0511@buzz.block.builderlab.xyz> Signed-off-by: kenny lopez <[email protected]>
…9369 - Compute the confirmed two-person pair once per channel as a value-equal record from the latest roster, including the stale-DM-metadata rule, instead of building roster sets in every message row on each emission. - Show the private-channel lock in the Android compact title pill. Co-authored-by: studio <dc2fc481343672df31a689840c09299972e704dac592e0da6f18486646a7ee3e@buzz.block.builderlab.xyz> Co-Authored-By: Claude Opus 5.5 <[email protected]> Signed-off-by: Tom Brow <[email protected]>
kalvinnchau
left a comment
There was a problem hiding this comment.
🤖 Forum spacing and stale-DM attribution fixes verified. One remaining renderer-consistency finding inline; the existing optional native-payload cleanup is unchanged.
| ), | ||
| if (channel.isEphemeral) ...[ | ||
| const SizedBox(width: Grid.quarter), | ||
| _HeaderEphemeralBadge(channel: channel), |
There was a problem hiding this comment.
🤖 [P3] Apply the name-only temporary-header rule to the Flutter renderers
The PR now explicitly retains name-only headers for temporary conversations, but this Android capsule still renders _HeaderEphemeralBadge, as does the Flutter title path at line 169. Native iOS omits the indicator, so the same temporary conversation changes its visible retention disclosure when a message-action backdrop switches iOS to the Flutter header, and Android retains the badge throughout. Apply the documented rule consistently to these renderers; this does not require restoring the intentionally declined native subtitle. Update the stale IosNavigationBar.swift:224 explanation that the subtitle carries visible expiry text as well. This inconsistency is source-confirmed; the native-to-Flutter transition was not runtime-tested.
kalvinnchau
left a comment
There was a problem hiding this comment.
🤖 Approved. Forum spacing and stale-DM attribution fixes were verified. The remaining P3 findings—temporary-header consistency and unused native portrait payload—are nonblocking follow-ups. Local full-suite and native-runtime validation limits remain as reported.
…9369 - Compute the confirmed two-person pair once per channel as a value-equal record from the latest roster, including the stale-DM-metadata rule, instead of building roster sets in every message row on each emission. - Show the private-channel lock in the Android compact title pill. Co-authored-by: studio <dc2fc481343672df31a689840c09299972e704dac592e0da6f18486646a7ee3e@buzz.block.builderlab.xyz> Co-Authored-By: Claude Opus 5.5 <[email protected]> Signed-off-by: Tom Brow <[email protected]>
…9369 (#9370) Follow-up to #9369 (conversation header avatars). Fixes two regressions found in its review. The intended behavior of #9369 stays the same. 1. **Message rows no longer each scan the roster.** `showMessageAuthorName` ran at the top of every message and thread row, in every channel. Each run watched a whole `Channel` object (which has no value equality) and built sets from the full roster, plus two more sets for the stale-DM check in DMs. A new `confirmedConversationPairProvider` works out the two-person pair once per channel, including the rule that a DM keeps attribution while its metadata disagrees with the roster. It returns a record that compares by value, so rows rebuild only when the pair itself changes. It reads `watchLatestChannelMembers`, so a revisit uses the cached roster and rows no longer re-wrap 48 dp wider once the roster fetch returns. The visible rule is the same as before. 2. **Android private channels show the lock again.** Every Android conversation header now uses the compact title pill, which had no lock. The pill now shows the existing lock icon (and its "Private channel" label) before the name. ### Validation - Added tests, all extending existing journeys: - The author-visibility journey checks that replacing the channel object (as live activity does) doesn't notify rows when the pair is unchanged. Its existing `stale-dm` case covers the metadata rule now inside the provider. - The private-lock header test expects the lock again. - Each new or restored Dart assertion fails with its fix reverted, and so does the `stale-dm` case with the provider's metadata rule removed. - Full mobile suite (`just mobile-test`) and `flutter analyze` pass. - Not run: an automated full-app session on a simulator or device. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Signed-off-by: Tom Brow <[email protected]> Co-authored-by: Tom Brow <[email protected]> Co-authored-by: studio <dc2fc481343672df31a689840c09299972e704dac592e0da6f18486646a7ee3e@buzz.block.builderlab.xyz> Co-authored-by: Claude Opus 5.5 <[email protected]>
…small * origin/main: fix(db): seek replaceable heads by channel (#9147) buzz-db: check events created_at floor in app writers (phase 1) (#8325) fix(mobile): keep a thread tail behind the keyboard unread (#9295) fix(mobile): restore header cues and per-channel identity check for #9369 (#9370) fix(relay): treat empty filter sets as match-nothing in SQL (#9342) buzz-cli: add --before and --before-id to messages search (#9382) feat(relay): agents cannot write in DMs except with their owner (#9371) fix(relay): bound each cross-node delivery attempt (#9305) feat(mobile): add iOS Home Screen shortcuts for New chat, New DM and the Bestie (#9360) perf(mobile): stop downloading whole videos for posterless stills (#9367) Enforce single-community relay mode (#9149) fix(relay): match #a tag filters in SQL before LIMIT (#9339) Add participant avatars to mobile conversation headers (#9369) fix(mobile): stop asking for an API token when the channel list is refused (#9327) chore(release): release Buzz Relay version 0.3.0 (#9362) Fix gallery video selection, thumbnails, and swipe dismissal (#9356) Signed-off-by: dessert <7d616e7e143e5d408159614dccff1371350a1c1bd36c8de838a45ece5aca0aca@buzz.block.builderlab.xyz>
Summary
Add participant portraits to mobile conversation headers, with up to four portraits in a compact cluster. DM and Solo headers show counterparts; channel headers use the member roster. Names stay on one line, and tapping either the portrait or title opens the existing settings.
Keep sender attribution visible while DM metadata and current membership disagree. Forum loading, error, and post-list states reserve the full conversation header height. The floating title follows the app-selected appearance, including when it differs from iOS. Conversation headers remain name-only, including temporary conversations, as requested; retention accessibility text is preserved.
Validation
The width follow-up is covered by rendered conversation/thread tests. The width follow-up is installed and launched on iPhone Air; the Pixel preview remains on the preceding header build. The review fixes have not been installed on physical devices.
Snapshots
Current Pixel preview, cropped to the header to omit conversation history. These captures show a single agent and a four-portrait cluster. The current iOS preview is installed, but a fresh physical-device screenshot was blocked by device authentication; no outdated iOS capture is included.
Android — single agent
Android — grouped agents