Skip to content

Redesign the base components and adopt the design system icons - #1805

Open
andremion wants to merge 3 commits into
andrerego/and-1419-introduce-streamdesign-in-the-compose-video-sdkfrom
andrerego/and-1420-redesign-base-components-against-the-shared-design-system
Open

Redesign the base components and adopt the design system icons#1805
andremion wants to merge 3 commits into
andrerego/and-1419-introduce-streamdesign-in-the-compose-video-sdkfrom
andrerego/and-1420-redesign-base-components-against-the-shared-design-system

Conversation

@andremion

@andremion andremion commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Stacked on #1803. Merge after parent, then retarget to develop-v2.

Goal

Closes AND-1420 - rebuild the Compose primitives on the StreamDesign tokens, following the chat SDK conventions, and replace the Material icons with the shared design system icon set.

Implementation

  • Icons: 134 stream_design_ic_* vector drawables converted from the design-system-tokens repository (core and video line sets plus message-bubbles-fill), source branch assets/icon-namespaces at a7750ef58d89992a0a5e6c12500d74f4d62d371b (design-system-tokens PR [38] refactor Outgoing & Incoming flows to represent call-engine state #67, still open). ICONS.md documents the pipeline. The compose module drops material-icons-extended; the ui-core stream_video_ic_* icons stay for the XML module and notifications.
  • Buttons: StreamButton, StreamTextButton, StreamIconButton with StreamButtonStyle, StreamButtonStyleDefaults (primary, secondary, destructive in solid, outline and ghost) and StreamButtonSize (32, 40, 48 with a 48dp touch target).
  • StreamDialog draws its own scrim and stacks full width actions; StreamTextField is a BasicTextField with the outlined field, focus and error borders, error text and error semantics; StreamBadgeBox uses the badge tokens.
  • New internal primitives for the controls sheet (AND-1428): StreamScrim, StreamBottomSheet (Material 3 ModalBottomSheet, adds the material3 dependency as chat did), StreamListItem, StreamMenuHeading, StreamMenuSeparator.
  • Avatars use the avatar tokens, a subtle border and size based initials typography. VideoComponentFactory.UserAvatar with UserAvatarParams is new and the SDK call sites go through it.
  • Indicators drawn over the dark overlay (microphone, network quality, bad network fallback) use textOnAccent in both palettes, per the Figma label spec.
  • Call actions take a StreamButtonStyle and a StreamButtonSize instead of shape, color and tint parameters, get content descriptions (four new ui-core strings), and ChatDialogAction emits ChatDialog instead of CancelCall.
  • Removed: the button, dialog, text field and badge style classes and providers, the toggle and drawable button variants, StreamDialogPositiveNegative, StreamOutlinedTextField, UserAvatar.textOffset. CompositeStyleProvider keeps only the icon and text styles until AND-1435 retires it. ParticipantAction.icon is a drawable id. Full list in the API dump diff, to be collected for the migration guide (AND-1436).
  • Follow-ups outside this PR: ScreenShareToggleAction still emits ClosedCaptionsAction (new core ToggleScreenShare action planned in AND-1428); VideoTheme.styles is no longer read by anything (AND-1435).

🎨 UI Changes

Every base component has light and dark goldens; the snapshot diff is the review artifact. New goldens: button styles enabled and disabled, button sizes, text fields, list items, scrim, bottom sheet. The redesigned dialog, badge and avatar goldens replace the old ones, and every screen golden changed because of the icon swap. Ringing controls render at the 48dp Large size (was 72dp) until the ringing designs land (AND-1433).

Testing

Manual: open the demo, start a call, check the control bar icons and the leave confirmation dialog; open the participants list and the participant "more" popup (list items); open the feedback dialog from the menu and submit an invalid email to see the error state; toggle the microphone in the lobby and check the label indicator in light mode.

Ran locally, all green: spotlessCheck, apiCheck, testDebugUnitTest and verifyPaparazziDebug on the compose module, compile of the demo app (development flavor) and the four tutorials, demo unit tests. Redundant snapshots removed (audio call without header, outgoing call audio type, incoming call details video, local participant tile, cancel action); suite is 149 tests and goldens. This repo has no detekt task.

Rebuild the Compose primitives on the StreamDesign tokens, following the
chat SDK conventions, and replace the Material icons with the shared
design system icon set.

Icons
- Add 134 `stream_design_ic_*` vector drawables converted from the
  design-system-tokens repository (core and video line sets plus
  `message-bubbles-fill`), source branch `assets/icon-namespaces` at
  a7750ef58d89992a0a5e6c12500d74f4d62d371b (PR #67). ICONS.md documents
  the pipeline. The compose module no longer depends on
  material-icons-extended. The ui-core `stream_video_ic_*` icons stay
  for the XML module and the notifications.

Primitives
- StreamButton, StreamTextButton and StreamIconButton with
  StreamButtonStyle, StreamButtonStyleDefaults and StreamButtonSize.
- StreamDialog with its own scrim and stacked actions, StreamTextField
  on BasicTextField with error text and semantics, StreamBadgeBox on the
  badge tokens.
- New internal primitives for the upcoming controls sheet: StreamScrim,
  StreamBottomSheet (Material 3 ModalBottomSheet), StreamListItem,
  StreamMenuHeading and StreamMenuSeparator.
- Avatars use the avatar tokens, a subtle border and size based initials
  typography. VideoComponentFactory gains UserAvatar with
  UserAvatarParams and the SDK call sites go through it.
- Indicators drawn over the dark overlay use the on-accent color in both
  palettes.

Removed
- The button, dialog, text field and badge style classes and providers,
  the toggle and drawable button variants, StreamDialogPositiveNegative
  and StreamOutlinedTextField. CompositeStyleProvider keeps only the
  icon and text styles until AND-1435 retires it.
- The shape, color and tint parameters of the call action composables;
  they take a StreamButtonStyle and a StreamButtonSize instead.
  ChatDialogAction now emits ChatDialog instead of CancelCall.
- UserAvatar textOffset; textStyle is nullable and defaults by size.
- ParticipantAction.icon is a drawable resource id.

Tests
- Previews and snapshot tests rewritten with light and dark coverage for
  every primitive. Goldens re-recorded. Redundant snapshots removed
  (participants 7, screen sharing for myself, audio call without header,
  outgoing call audio type, incoming call details video, local
  participant tile, cancel call action).
@andremion andremion added the pr:new-feature Adds new functionality label Sep 3, 2026
@github-actions

github-actions Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

PR checklist ✅

All required conditions are satisfied:

  • Title length is OK (or ignored by label).
  • At least one pr: label exists.
  • Sections ### Goal, ### Implementation, and ### Testing are filled, or the PR is bot-authored.
  • An issue is linked (Linear ticket or GitHub issue), or the PR is bot-authored.

🎉 Great job! This PR is ready for review.

@andremion

Copy link
Copy Markdown
Contributor Author

@CodeRabbit review

@coderabbitai

coderabbitai Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor
⚠️ Action not completed

Review skipped: 249 files exceed the limit of 100.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@github-actions

github-actions Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

SDK Size Comparison 📏

SDK Before After Difference Status
stream-video-android-core 12.30 MB 12.45 MB 0.14 MB 🟢
stream-video-android-ui-xml 5.70 MB 5.75 MB 0.05 MB 🟢
stream-video-android-ui-compose 6.23 MB 3.23 MB -3.00 MB 🚀

Two regressions found by the E2E suite on the redesigned primitives.

StreamTextField wrapped the field in a Column that carried the caller's
modifier, so a test tag or a weight landed on a layout node instead of
the editable one. UiAutomator could not type the call id into
`Stream_CallIdInputField`, and the re-entry tests joined a fresh random
call. The field is the root node again and the error message is part of
its decoration box.

StreamDialog filled the whole window to draw its own scrim, so the
platform could not move it above the keyboard and the "Login" button of
the email dialog stayed hidden. The dialog is a wrap-content platform
dialog again, dimmed by the platform; StreamScrim stays for in-layout
overlays.
Adds snapshots for the screen share toggle, the pending toggle state in
every button size, the scrim click variant, and the one, two and
deprecated overload variants of the participant avatars. Raises the new
code coverage above the SonarCloud gate.
@sonarqubecloud

sonarqubecloud Bot commented Sep 3, 2026

Copy link
Copy Markdown

@andremion
andremion marked this pull request as ready for review September 3, 2026 14:14
@andremion
andremion requested a review from a team as a code owner September 3, 2026 14:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pr:new-feature Adds new functionality

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant