Skip to content

feat(ui): redesign the incoming and outgoing ringing screens - #1359

Draft
renefloor wants to merge 8 commits into
v2from
feat/ringing-call-screens-redesign
Draft

renefloor wants to merge 8 commits into
v2from
feat/ringing-call-screens-redesign

Conversation

@renefloor

Copy link
Copy Markdown
Contributor

🎯 Goal

Rebuild the incoming and outgoing ringing screens on the design system, and bring the Android full-screen incoming call in line with them.

🛠 Implementation details

The Flutter screens. Both are an avatar over a name and a status line, with the call controls below. The incoming screen sits on the app surface and keeps the microphone and camera toggles the design drops; the outgoing one is drawn on top of the caller's own camera, blurred behind a scrim, and falls back to the flat scrim when the camera is off. It keeps its simpler button layout rather than the design's in-call bars.

StreamRingingCameraController opens the camera the outgoing screen previews and hands it to the call as TrackOption.provided, so answering carries on with that camera rather than opening a second one.

CallRingingButton is the 64px round button answering, declining and cancelling are drawn with — a size no StreamButtonSize names. CallControlButton gains a themeStyle pass-through to carry it: it resolves after the ambient StreamButtonTheme, where a nested one would be dropped for the positive tone, which already brings a theme of its own.

Theming. StreamIncomingCallThemeData and StreamOutgoingCallThemeData land on StreamVideoTheme, each carrying a StreamRingingCallStyle that StreamIncomingCallContent.style and StreamOutgoingCallContent.style override per call site. The internal pieces take the resolved defaults rather than the all-nullable style, so nothing can hand them a style full of nulls.

Localization. The ringing screens' text was hardcoded English; it now comes from the localizations, in English and Dutch.

Android full-screen incoming call. The activity follows the same design: the app surface rather than the blue default, a 104dp avatar, 64dp accept and decline buttons centred 80dp apart above the bottom. Call.kt no longer defaults fullScreenBackgroundColor and fullScreenTextColor, so the resource defaults are actually reached — the bundle always carried a colour before, and the full-screen UI stayed blue whatever the resources said. An integrator's own colour still paints all four labels, and a malformed colour is logged rather than silently ignored.

🚧 Blocked on two other repos

The root pubspec.yaml pins both by SHA. Both pins come off before this merges:

🎨 UI Changes

Before After
img img

🧪 Testing

Golden tests cover both screens; the committed goldens/ci/*.png are updated in this branch. The Android activity is not covered by tests — try it by ringing the dogfooding app with the screen locked.

🤖 Generated with Claude Code

renefloor and others added 8 commits September 11, 2026 13:12
The ringing designs give answering and declining a button no StreamButtonSize
names. CallControlButton gains a themeStyle pass-through to carry the size:
it resolves after the ambient theme, where a nested StreamButtonTheme would
be dropped for the positive tone, which already brings one of its own.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Both are now an avatar over a name and a status line with the controls
below, built on the design system. The incoming screen sits on the app
surface; the outgoing one is drawn on the caller's own camera, blurred
behind a scrim, opened by a controller that hands the track to the call so
answering does not open the camera a second time.

The outgoing screen keeps its simpler button layout rather than the design's
in-call bars, and the incoming one keeps the microphone and camera toggles
the design drops.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The full-screen activity follows the redesigned ringing screen: the app
surface rather than the blue default, a 104dp avatar, and 64dp accept and
decline buttons centred 80dp apart above the bottom.

The text colour no longer defaults to white, so the caller's name, the
handle and the action labels each take the colour the design gives them; an
integrator's own colour still paints all four. A malformed colour is logged
rather than silently ignored.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The internal pieces took a StreamRingingCallStyle, whose every field is
nullable, and force-unwrapped what the screen had already resolved. They
take the resolved defaults instead, so nothing can hand them a style full of
nulls. RingingCallBackground stays public and resolves its own, since a
callBackgroundWidgetBuilder has no resolved style to pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The 104px sizes added to stream_core_flutter stop 10.4.0 compiling, whose
switches over the size enums are exhaustive. Only the dogfooding app pulls
chat in, so the SDK packages and CI were unaffected — the app was not.

Drop the override once a chat release carries the fix.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The restyle gave IncomingCallActivity resource defaults to fall back to, but
Call.kt still defaulted fullScreenBackgroundColor to #0955fa and
fullScreenTextColor to white, so the bundle always carried a colour and the
resources were never reached — the full-screen UI stayed blue. They default
to empty now, which is what the activity reads as "unset".

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Sep 18, 2026

Copy link
Copy Markdown

Important

Draft PR not reviewed

Draft PRs are not automatically reviewed by default.

  • Trigger a manual review

To automatically review draft PRs, update your CodeRabbit configuration:

reviews:
  auto_review:
    drafts: true

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant