From 579c6fe4d936db473131acb6a3f0e7494ce9b123 Mon Sep 17 00:00:00 2001 From: zarzet <42882290+zarzet@users.noreply.github.com> Date: Sun, 27 Sep 2026 16:11:00 +0700 Subject: [PATCH] fix(ui): show Dolby Atmos as a compact logo --- lib/screens/album_screen.dart | 11 ++++++- lib/widgets/audio_quality_badges.dart | 42 ++++++++++++++------------- test/album_track_metadata_test.dart | 3 +- 3 files changed, 34 insertions(+), 22 deletions(-) diff --git a/lib/screens/album_screen.dart b/lib/screens/album_screen.dart index b323ea66..85cc7dbd 100644 --- a/lib/screens/album_screen.dart +++ b/lib/screens/album_screen.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart' show CupertinoIcons; import 'package:spotiflac_android/theme/app_tokens.dart'; import 'package:spotiflac_android/theme/mornye_theme.dart'; +import 'package:spotiflac_android/theme/cover_palette.dart'; import 'package:spotiflac_android/screens/track_history_snapshot.dart'; import 'package:spotiflac_android/widgets/collection_scaffold.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; @@ -31,6 +32,7 @@ import 'package:spotiflac_android/widgets/playlist_picker_sheet.dart'; import 'package:spotiflac_android/utils/clickable_metadata.dart'; import 'package:spotiflac_android/widgets/cross_extension_share_sheet.dart'; import 'package:spotiflac_android/widgets/track_list_tile.dart'; +import 'package:spotiflac_android/widgets/audio_quality_badges.dart'; import 'package:spotiflac_android/widgets/motion_header_banner.dart'; import 'package:spotiflac_android/widgets/track_detail_actions.dart'; import 'package:spotiflac_android/widgets/selection_action_button.dart'; @@ -276,7 +278,14 @@ class _AlbumScreenState extends ConsumerState final items = []; if (has(['atmos', 'dolby_atmos', 'dolby-atmos'])) { - items.add(HeaderMetaItem('Dolby Atmos', icon: Icons.surround_sound)); + items.add( + Builder( + builder: (context) => DolbyAtmosLogo( + color: HeaderPalette.of(context).onSurface, + size: const Size(18, 12), + ), + ), + ); } else if (has(['spatial'])) { items.add(HeaderMetaItem('Spatial Audio', icon: Icons.surround_sound)); } diff --git a/lib/widgets/audio_quality_badges.dart b/lib/widgets/audio_quality_badges.dart index 4e721829..225442df 100644 --- a/lib/widgets/audio_quality_badges.dart +++ b/lib/widgets/audio_quality_badges.dart @@ -129,34 +129,36 @@ class DolbyAtmosBadge extends StatelessWidget { @override Widget build(BuildContext context) { return Container( - padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 1), + padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 3), decoration: BoxDecoration( color: colorScheme.tertiaryContainer.withValues(alpha: 0.6), borderRadius: context.tokens.borderRadiusBadge, ), - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - CustomPaint( - size: const Size(14, 10), - painter: DolbyLogoPainter(color: colorScheme.onTertiaryContainer), - ), - const SizedBox(width: 3), - Text( - 'Atmos', - style: TextStyle( - fontSize: context.tokens.badgeFontSize, - fontWeight: FontWeight.w600, - color: colorScheme.onTertiaryContainer, - height: 1.3, - ), - ), - ], - ), + child: DolbyAtmosLogo(color: colorScheme.onTertiaryContainer), ); } } +class DolbyAtmosLogo extends StatelessWidget { + const DolbyAtmosLogo({ + super.key, + required this.color, + this.size = const Size(14, 10), + }); + + final Color color; + final Size size; + + @override + Widget build(BuildContext context) => Tooltip( + message: 'Dolby Atmos', + child: CustomPaint( + size: size, + painter: DolbyLogoPainter(color: color), + ), + ); +} + class DolbyLogoPainter extends CustomPainter { final Color color; diff --git a/test/album_track_metadata_test.dart b/test/album_track_metadata_test.dart index 05a7c931..1c679c5d 100644 --- a/test/album_track_metadata_test.dart +++ b/test/album_track_metadata_test.dart @@ -276,7 +276,8 @@ void main() { expect(albumTrack.totalTracks, 1); expect(albumTrack.audioQuality, '16-bit'); expect(find.text('Lossless'), findsOneWidget); - expect(find.text('Dolby Atmos'), findsOneWidget); + expect(find.text('Dolby Atmos'), findsNothing); + expect(find.byTooltip('Dolby Atmos'), findsOneWidget); expect(find.byType(AudioQualityBadge), findsNothing); expect(find.byType(DolbyAtmosBadge), findsNothing); expect(find.byType(ExplicitBadge), findsOneWidget);