From 28f914ddf41700c0ef14b132f6c284b986658db4 Mon Sep 17 00:00:00 2001 From: Rene Floor Date: Thu, 19 Mar 2026 16:08:41 +0100 Subject: [PATCH 1/3] Add time formatting options to media badge --- .../components/badge/stream_media_badge.dart | 49 +++- .../badge/stream_media_badge_golden_test.dart | 214 ++++++++++++++++++ 2 files changed, 259 insertions(+), 4 deletions(-) create mode 100644 packages/stream_core_flutter/test/components/badge/stream_media_badge_golden_test.dart diff --git a/packages/stream_core_flutter/lib/src/components/badge/stream_media_badge.dart b/packages/stream_core_flutter/lib/src/components/badge/stream_media_badge.dart index 2a6ad99..f048158 100644 --- a/packages/stream_core_flutter/lib/src/components/badge/stream_media_badge.dart +++ b/packages/stream_core_flutter/lib/src/components/badge/stream_media_badge.dart @@ -2,17 +2,41 @@ import 'package:flutter/widgets.dart'; import '../../../stream_core_flutter.dart'; +/// Controls how a duration value is formatted inside [StreamMediaBadge]. +enum MediaBadgeDurationFormat { + /// Compact contextual format — floored, no exact time shown. + /// + /// - < 1 minute → `Xs` (e.g. `8s`) + /// - < 1 hour → `Xm` (e.g. `1m`, `10m`) + /// - ≥ 1 hour → `Xh` (e.g. `1h`, `2h`) + compact, + + /// Exact time format — no rounding or truncation. + /// + /// - < 1 hour → `M:SS` (e.g. `0:08`, `10:08`) + /// - ≥ 1 hour → `H:MM:SS` (e.g. `1:00:08`) + exact, +} + class StreamMediaBadge extends StatelessWidget { - const StreamMediaBadge({super.key, required this.type, this.duration}); + const StreamMediaBadge({ + super.key, + required this.type, + this.duration, + this.durationFormat = MediaBadgeDurationFormat.compact, + }); final MediaBadgeType type; final Duration? duration; + /// How the [duration] value is formatted. Defaults to [MediaBadgeDurationFormat.compact]. + final MediaBadgeDurationFormat durationFormat; + @override Widget build(BuildContext context) { return Container( decoration: BoxDecoration( - color: context.streamColorScheme.chrome[10000], + color: context.streamColorScheme.chrome[1000], borderRadius: BorderRadius.all(context.streamRadius.max), ), padding: EdgeInsets.symmetric( @@ -33,7 +57,10 @@ class StreamMediaBadge extends StatelessWidget { if (duration case final duration?) Text( - duration.toReadableString(), + switch (durationFormat) { + MediaBadgeDurationFormat.compact => duration.toCompactString(), + MediaBadgeDurationFormat.exact => duration.toExactString(), + }, style: context.streamTextTheme.numericMd.copyWith(color: context.streamColorScheme.textInverse), ), ], @@ -43,7 +70,9 @@ class StreamMediaBadge extends StatelessWidget { } extension on Duration { - String toReadableString() { + /// Compact contextual format, always floored. + /// `8s`, `1m`, `10m`, `1h`, `2h` + String toCompactString() { if (inSeconds < 60) { return '${inSeconds}s'; } @@ -52,6 +81,18 @@ extension on Duration { } return '${inHours}h'; } + + /// Exact time format. + /// `0:08`, `10:08`, `1:00:08` + String toExactString() { + final h = inHours; + final m = inMinutes.remainder(60); + final s = inSeconds.remainder(60); + if (h > 0) { + return '$h:${m.toString().padLeft(2, '0')}:${s.toString().padLeft(2, '0')}'; + } + return '$m:${s.toString().padLeft(2, '0')}'; + } } enum MediaBadgeType { video, audio } diff --git a/packages/stream_core_flutter/test/components/badge/stream_media_badge_golden_test.dart b/packages/stream_core_flutter/test/components/badge/stream_media_badge_golden_test.dart new file mode 100644 index 0000000..da3353b --- /dev/null +++ b/packages/stream_core_flutter/test/components/badge/stream_media_badge_golden_test.dart @@ -0,0 +1,214 @@ +import 'package:alchemist/alchemist.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:stream_core_flutter/stream_core_flutter.dart'; + +void main() { + group('StreamMediaBadge Golden Tests', () { + goldenTest( + 'renders light theme type matrix', + fileName: 'stream_media_badge_light_matrix', + builder: () => GoldenTestGroup( + scenarioConstraints: const BoxConstraints(maxWidth: 200), + children: [ + for (final type in MediaBadgeType.values) ...[ + GoldenTestScenario( + name: '${type.name}_no_duration', + child: _buildInTheme(StreamMediaBadge(type: type)), + ), + GoldenTestScenario( + name: '${type.name}_with_duration', + child: _buildInTheme( + StreamMediaBadge( + type: type, + duration: const Duration(seconds: 8), + ), + ), + ), + ], + ], + ), + ); + + goldenTest( + 'renders dark theme type matrix', + fileName: 'stream_media_badge_dark_matrix', + builder: () => GoldenTestGroup( + scenarioConstraints: const BoxConstraints(maxWidth: 200), + children: [ + for (final type in MediaBadgeType.values) ...[ + GoldenTestScenario( + name: '${type.name}_no_duration', + child: _buildInTheme( + StreamMediaBadge(type: type), + brightness: Brightness.dark, + ), + ), + GoldenTestScenario( + name: '${type.name}_with_duration', + child: _buildInTheme( + StreamMediaBadge( + type: type, + duration: const Duration(seconds: 8), + ), + brightness: Brightness.dark, + ), + ), + ], + ], + ), + ); + + goldenTest( + 'renders compact duration format correctly', + fileName: 'stream_media_badge_compact_duration', + builder: () => GoldenTestGroup( + scenarioConstraints: const BoxConstraints(maxWidth: 200), + children: [ + GoldenTestScenario( + name: '8s', + child: _buildInTheme( + const StreamMediaBadge( + type: MediaBadgeType.video, + duration: Duration(seconds: 8), + durationFormat: MediaBadgeDurationFormat.compact, + ), + ), + ), + GoldenTestScenario( + name: '1m', + child: _buildInTheme( + const StreamMediaBadge( + type: MediaBadgeType.video, + duration: Duration(seconds: 60), + durationFormat: MediaBadgeDurationFormat.compact, + ), + ), + ), + GoldenTestScenario( + name: '10m', + child: _buildInTheme( + const StreamMediaBadge( + type: MediaBadgeType.video, + duration: Duration(seconds: 608), // 10:08 → 10m + durationFormat: MediaBadgeDurationFormat.compact, + ), + ), + ), + GoldenTestScenario( + name: '59m', + child: _buildInTheme( + const StreamMediaBadge( + type: MediaBadgeType.video, + duration: Duration(seconds: 3599), // 59:59 → 59m + durationFormat: MediaBadgeDurationFormat.compact, + ), + ), + ), + GoldenTestScenario( + name: '1h', + child: _buildInTheme( + const StreamMediaBadge( + type: MediaBadgeType.video, + duration: Duration(hours: 1), + durationFormat: MediaBadgeDurationFormat.compact, + ), + ), + ), + GoldenTestScenario( + name: '2h', + child: _buildInTheme( + const StreamMediaBadge( + type: MediaBadgeType.video, + duration: Duration(hours: 2), + durationFormat: MediaBadgeDurationFormat.compact, + ), + ), + ), + ], + ), + ); + + goldenTest( + 'renders exact duration format correctly', + fileName: 'stream_media_badge_exact_duration', + builder: () => GoldenTestGroup( + scenarioConstraints: const BoxConstraints(maxWidth: 200), + children: [ + GoldenTestScenario( + name: '0:08', + child: _buildInTheme( + const StreamMediaBadge( + type: MediaBadgeType.video, + duration: Duration(seconds: 8), + durationFormat: MediaBadgeDurationFormat.exact, + ), + ), + ), + GoldenTestScenario( + name: '10:08', + child: _buildInTheme( + const StreamMediaBadge( + type: MediaBadgeType.video, + duration: Duration(seconds: 608), + durationFormat: MediaBadgeDurationFormat.exact, + ), + ), + ), + GoldenTestScenario( + name: '59:59', + child: _buildInTheme( + const StreamMediaBadge( + type: MediaBadgeType.video, + duration: Duration(seconds: 3599), + durationFormat: MediaBadgeDurationFormat.exact, + ), + ), + ), + GoldenTestScenario( + name: '1:00:08', + child: _buildInTheme( + const StreamMediaBadge( + type: MediaBadgeType.video, + duration: Duration(hours: 1, seconds: 8), + durationFormat: MediaBadgeDurationFormat.exact, + ), + ), + ), + GoldenTestScenario( + name: '1:59:59', + child: _buildInTheme( + const StreamMediaBadge( + type: MediaBadgeType.video, + duration: Duration(hours: 1, minutes: 59, seconds: 59), + durationFormat: MediaBadgeDurationFormat.exact, + ), + ), + ), + ], + ), + ); + }); +} + +Widget _buildInTheme( + Widget child, { + Brightness brightness = Brightness.light, +}) { + final streamTheme = StreamTheme(brightness: brightness); + return Theme( + data: ThemeData( + brightness: brightness, + extensions: [streamTheme], + ), + child: Builder( + builder: (context) => Material( + color: StreamTheme.of(context).colorScheme.backgroundApp, + child: Padding( + padding: const EdgeInsets.all(8), + child: Center(child: child), + ), + ), + ), + ); +} From eb3a467ec71dc6981fe41cdb2d901ebd3ba28f28 Mon Sep 17 00:00:00 2001 From: renefloor <15101411+renefloor@users.noreply.github.com> Date: Thu, 19 Mar 2026 15:47:11 +0000 Subject: [PATCH 2/3] chore: Update Goldens --- .../ci/stream_media_badge_compact_duration.png | Bin 0 -> 3271 bytes .../ci/stream_media_badge_dark_matrix.png | Bin 0 -> 2854 bytes .../ci/stream_media_badge_exact_duration.png | Bin 0 -> 3259 bytes .../ci/stream_media_badge_light_matrix.png | Bin 0 -> 2881 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 packages/stream_core_flutter/test/components/badge/goldens/ci/stream_media_badge_compact_duration.png create mode 100644 packages/stream_core_flutter/test/components/badge/goldens/ci/stream_media_badge_dark_matrix.png create mode 100644 packages/stream_core_flutter/test/components/badge/goldens/ci/stream_media_badge_exact_duration.png create mode 100644 packages/stream_core_flutter/test/components/badge/goldens/ci/stream_media_badge_light_matrix.png diff --git a/packages/stream_core_flutter/test/components/badge/goldens/ci/stream_media_badge_compact_duration.png b/packages/stream_core_flutter/test/components/badge/goldens/ci/stream_media_badge_compact_duration.png new file mode 100644 index 0000000000000000000000000000000000000000..2e3faf9301f2214c13943ca3c4659f943daa528a GIT binary patch literal 3271 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 IOwTd=-(g^bd;kCd literal 0 HcmV?d00001 diff --git a/packages/stream_core_flutter/test/components/badge/goldens/ci/stream_media_badge_dark_matrix.png b/packages/stream_core_flutter/test/components/badge/goldens/ci/stream_media_badge_dark_matrix.png new file mode 100644 index 0000000000000000000000000000000000000000..144ff33386bd048eb744c593d3017b3d94ccccac GIT binary patch literal 2854 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 literal 0 HcmV?d00001 diff --git a/packages/stream_core_flutter/test/components/badge/goldens/ci/stream_media_badge_light_matrix.png b/packages/stream_core_flutter/test/components/badge/goldens/ci/stream_media_badge_light_matrix.png new file mode 100644 index 0000000000000000000000000000000000000000..78e1cdb7511f17d0902f151ee810ea82b5667d98 GIT binary patch literal 2881 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 literal 0 HcmV?d00001 From 5becf870e201bfa9269c22ec8a4d143172ee5431 Mon Sep 17 00:00:00 2001 From: Rene Floor Date: Thu, 19 Mar 2026 16:52:15 +0100 Subject: [PATCH 3/3] ignore redundant arguments rule --- .../test/components/badge/stream_media_badge_golden_test.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/stream_core_flutter/test/components/badge/stream_media_badge_golden_test.dart b/packages/stream_core_flutter/test/components/badge/stream_media_badge_golden_test.dart index da3353b..c5c68da 100644 --- a/packages/stream_core_flutter/test/components/badge/stream_media_badge_golden_test.dart +++ b/packages/stream_core_flutter/test/components/badge/stream_media_badge_golden_test.dart @@ -1,3 +1,5 @@ +// ignore_for_file: avoid_redundant_argument_values + import 'package:alchemist/alchemist.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart';