Skip to content

Add participant avatars to mobile conversation headers - #9369

Merged
klopez4212 merged 7 commits into
mainfrom
kennylopez-dm-header-avatar-20261111
Nov 11, 2026
Merged

klopez4212 merged 7 commits into
mainfrom
kennylopez-dm-header-avatar-20261111

Conversation

@klopez4212

@klopez4212 klopez4212 commented Nov 11, 2026 •

Copy link
Copy Markdown
Contributor

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.

  • iOS: float portraits above the glass title capsule; lift standalone animated artwork and tuck the title underneath.
  • Android: place the cluster inside a left-aligned title pill, 16 dp after Back, with smaller agent portraits and a 48 dp tap target.
  • Remove header presence/member-count subtitles. In confirmed two-member conversations (DM, Solo, or channel), hide redundant incoming author avatars and give text the freed 48 dp while retaining the previous total width. Apply this to thread replies and align their footers; messages with avatars and outgoing messages retain their production width caps.

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

  • Formatting/static analysis and full mobile suite: 4,695 passed, 71 skipped; auxiliary push and crypto suites passed.
  • Full native iOS suite passed, including title positioning/reset and settings activation.
  • Installed previews on physical iPhone Air and Pixel; Android avatar/title settings taps exercised.
  • Final diff reviewed for correctness, accessibility, scope, and public-source boundaries; no blocking findings.

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 single-agent header

Android — grouped agents

Android grouped-agent header

klopez4212 and others added 2 commits November 11, 2026 13:20
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]>
@klopez4212
klopez4212 marked this pull request as ready for review November 11, 2026 21:28
@klopez4212
klopez4212 requested a review from a team as a code owner November 11, 2026 21:28
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Nov 11, 2026 •

Copy link
Copy Markdown
Codex Review Summary: ✅ Completed

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-11-11T23:06:31.317009Z 724ee7e New commits
ℹ️ 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@klopez4212
klopez4212 deployed to codex-review November 11, 2026 21:28 — with GitHub Actions Active

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

@github-actions github-actions Bot added the codex-security-review-current The posted Codex security review matches its recorded range. label Nov 11, 2026
@github-actions

github-actions Bot commented Nov 11, 2026 •

Copy link
Copy Markdown

🔐 Codex Security Review

Note: This is an automated, security-focused review generated by Codex.
Use it as a supplement to human review; false positives are possible.

Scope

  • Exact PR diff: 8f80b172ea0d7dc559807723f8ad4a2334d7a6fd...724ee7e7d1aa4a86a9775bb5778837f2612bdef2
  • Model: gpt-6.1-sol

💡 Click "edited" above to see earlier reviews for this PR.


Review Summary

Overall Risk: LOW

One iOS correctness regression removes the visible ephemeral-channel retention disclosure.

Findings

[LOW] Preserve a visible retention indicator in native iOS headers

  • Category: Desktop/Mobile
  • Location: mobile/lib/features/channels/channel_detail_page.dart:694 (source)
  • Description: The native subtitle is now always empty, including for ephemeral channels. The remaining nativeEphemeralLabel reaches NavigationTitleView.setEphemeralStatus, which only appends to accessibilityLabel. FrostedAppBar's native iOS branch does not render the Flutter title containing _HeaderEphemeralBadge, so the conversation loses both its visible temporary status and its expiry or cleanup warning.
  • Impact: Sighted iOS users cannot distinguish a temporary conversation from a permanent one in its header before the relay automatically archives it.
  • Recommendation: Render a visible native retention badge or retain the retention subtitle for ephemeral channels while keeping ordinary conversation subtitles hidden.

Notes

  • Review used read-only source inspection; builds and tests were not executed.

Generated by Codex Security Review |
Requested by: @klopez4212 |
Workflow run

@github-actions github-actions Bot removed the codex-security-review-current The posted Codex security review matches its recorded range. label Nov 11, 2026
@klopez4212
klopez4212 deployed to codex-review November 11, 2026 21:36 — with GitHub Actions Active
@github-actions github-actions Bot added the codex-security-review-current The posted Codex security review matches its recorded range. label Nov 11, 2026

@kalvinnchau kalvinnchau left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 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'),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 [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.

klopez4212 and others added 2 commits November 11, 2026 14:34
…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]>
@github-actions github-actions Bot removed the codex-security-review-current The posted Codex security review matches its recorded range. label Nov 11, 2026
@klopez4212
klopez4212 deployed to codex-review November 11, 2026 22:40 — with GitHub Actions Active

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

@github-actions github-actions Bot added the codex-security-review-current The posted Codex security review matches its recorded range. label Nov 11, 2026
@klopez4212

Copy link
Copy Markdown
Contributor Author

🤖 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]>
brow pushed a commit that referenced this pull request Nov 11, 2026
…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]>
@klopez4212
klopez4212 deployed to codex-review November 11, 2026 23:04 — with GitHub Actions Active
@github-actions github-actions Bot added codex-security-review-current The posted Codex security review matches its recorded range. and removed codex-security-review-current The posted Codex security review matches its recorded range. labels Nov 11, 2026
brow pushed a commit that referenced this pull request Nov 11, 2026
…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 kalvinnchau left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 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),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 [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 kalvinnchau left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 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.

@klopez4212
klopez4212 merged commit 96e56c5 into main Nov 11, 2026
53 checks passed
@klopez4212
klopez4212 deleted the kennylopez-dm-header-avatar-20261111 branch November 11, 2026 23:28
brow pushed a commit that referenced this pull request Nov 11, 2026
…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]>
brow added a commit that referenced this pull request Nov 12, 2026
…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]>
ravarora2 pushed a commit that referenced this pull request Nov 12, 2026
…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>

This branch was successfully deployed

1 active deployment
codex-review — 724ee7e7 Deployed Nov 11, 2026 by klopez4212 via Run Codex Security Review #14493
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

codex-security-review-current The posted Codex security review matches its recorded range.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants