fix(ui): show Dolby Atmos as a compact logo

This commit is contained in:
zarzet
2026-09-27 16:11:00 +07:00
parent 63210c0277
commit 579c6fe4d9
3 changed files with 34 additions and 22 deletions
+10 -1
View File
@@ -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<AlbumScreen>
final items = <Widget>[];
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));
}
+22 -20
View File
@@ -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;
+2 -1
View File
@@ -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);