From 611f7377f6f61862991db6fac64def4289de14a9 Mon Sep 17 00:00:00 2001 From: zarzet Date: Sat, 1 Aug 2026 16:10:31 +0700 Subject: [PATCH] fix(metadata): keep header details legible in light theme --- lib/screens/track_metadata_cards.dart | 53 +++++++++------- lib/screens/track_metadata_screen.dart | 1 + test/track_metadata_header_contrast_test.dart | 60 +++++++++++++++++++ 3 files changed, 92 insertions(+), 22 deletions(-) create mode 100644 test/track_metadata_header_contrast_test.dart diff --git a/lib/screens/track_metadata_cards.dart b/lib/screens/track_metadata_cards.dart index f0a51672..04420be2 100644 --- a/lib/screens/track_metadata_cards.dart +++ b/lib/screens/track_metadata_cards.dart @@ -1,5 +1,11 @@ part of 'track_metadata_screen.dart'; +const _trackMetadataHeroScheme = ColorScheme.dark( + surface: Colors.black, + onSurface: Colors.white, + onSurfaceVariant: Colors.white70, +); + extension _TrackMetadataCards on _TrackMetadataScreenState { Widget _buildAnimatedTrackContent( BuildContext context, @@ -222,28 +228,31 @@ extension _TrackMetadataCards on _TrackMetadataScreenState { overflow: TextOverflow.ellipsis, ), const SizedBox(height: 12), - HeaderMetaRow( - items: [ - if (_displayAudioQuality != null && - _displayAudioQuality!.isNotEmpty) - HeaderMetaItem(_displayAudioQuality!), - if (duration != null) - HeaderMetaItem(formatClock(duration!)), - if (_service != 'local') - HeaderMetaItem( - _service[0].toUpperCase() + _service.substring(1), - ) - else - HeaderMetaItem( - context.l10n.librarySourceLocal, - icon: Icons.folder, - ), - if (_hasCheckedFile && !_fileExists) - HeaderMetaItem( - context.l10n.trackFileNotFound, - icon: Icons.warning_rounded, - ), - ], + HeaderPalette( + scheme: _trackMetadataHeroScheme, + child: HeaderMetaRow( + items: [ + if (_displayAudioQuality != null && + _displayAudioQuality!.isNotEmpty) + HeaderMetaItem(_displayAudioQuality!), + if (duration != null) + HeaderMetaItem(formatClock(duration!)), + if (_service != 'local') + HeaderMetaItem( + _service[0].toUpperCase() + _service.substring(1), + ) + else + HeaderMetaItem( + context.l10n.librarySourceLocal, + icon: Icons.folder, + ), + if (_hasCheckedFile && !_fileExists) + HeaderMetaItem( + context.l10n.trackFileNotFound, + icon: Icons.warning_rounded, + ), + ], + ), ), ], ), diff --git a/lib/screens/track_metadata_screen.dart b/lib/screens/track_metadata_screen.dart index 1bd32d98..a7adebf4 100644 --- a/lib/screens/track_metadata_screen.dart +++ b/lib/screens/track_metadata_screen.dart @@ -36,6 +36,7 @@ import 'package:spotiflac_android/utils/user_facing_error.dart'; import 'package:spotiflac_android/utils/int_utils.dart'; import 'package:spotiflac_android/utils/nav_bar_inset.dart'; import 'package:spotiflac_android/utils/re_enrich_release_policy.dart'; +import 'package:spotiflac_android/theme/cover_palette.dart' show HeaderPalette; import 'package:spotiflac_android/widgets/album_detail_header.dart' show HeaderMetaRow, HeaderMetaItem; import 'package:spotiflac_android/widgets/audio_analysis_widget.dart'; diff --git a/test/track_metadata_header_contrast_test.dart b/test/track_metadata_header_contrast_test.dart new file mode 100644 index 00000000..8f6e3853 --- /dev/null +++ b/test/track_metadata_header_contrast_test.dart @@ -0,0 +1,60 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:spotiflac_android/l10n/l10n.dart'; +import 'package:spotiflac_android/providers/download_history_provider.dart'; +import 'package:spotiflac_android/screens/track_metadata_screen.dart'; +import 'package:spotiflac_android/widgets/album_detail_header.dart'; + +void main() { + testWidgets('metadata hero keeps technical text legible in light theme', ( + tester, + ) async { + await tester.binding.setSurfaceSize(const Size(430, 900)); + addTearDown(() => tester.binding.setSurfaceSize(null)); + + final item = DownloadHistoryItem( + id: 'history-track', + trackName: 'Track', + artistName: 'Artist', + albumName: 'Album', + filePath: r'Z:\missing\track.flac', + service: 'tidal-web', + downloadedAt: DateTime(2026), + duration: 250, + bitDepth: 16, + sampleRate: 44100, + format: 'flac', + ); + + await tester.pumpWidget( + ProviderScope( + child: MaterialApp( + theme: ThemeData.light(useMaterial3: true), + localizationsDelegates: AppLocalizations.localizationsDelegates, + supportedLocales: AppLocalizations.supportedLocales, + home: TrackMetadataScreen(item: item), + ), + ), + ); + await tester.pump(); + + final headerMeta = find.byType(HeaderMetaRow); + expect(headerMeta, findsOneWidget); + for (final label in const ['16-bit/44.1kHz', '4:10', 'Tidal-web']) { + final text = tester.widget( + find.descendant(of: headerMeta, matching: find.text(label)), + ); + expect(text.style?.color, Colors.white); + } + + final separators = tester.widgetList( + find.descendant(of: headerMeta, matching: find.text('•')), + ); + expect(separators, isNotEmpty); + expect( + separators.every((text) => text.style?.color == Colors.white70), + isTrue, + ); + }); +}