feat(reproductor): restructure full player with tool-tray and EQ sheet

Restructure pantalla_reproductor.dart onto PluriPushScaffold (design
ADR-2 - this screen is the documented single consumer of titleOverride,
a centered live/not-playing status pill, and the non-default
keyboard_arrow_down leadingIcon). Square art replaces the old circular
hero, favorite moves from the AppBar into the transport row (the
redundant live-indicator dot is dropped - the AppBar pill already covers
that signal), the old separate info chips collapse into a single
subtitle line, and a new quality row surfaces codec/bitrate with a
"Cambiar" action that reconnects the current stream (this app has no
per-station alternate-quality capability to invoke, so this reuses the
same reproducir() call the existing error-state retry button already
uses, rather than a dead button or an invented picker).

The always-expanded recording panel and the standalone sleep-timer
button both become tool-tray tiles (EQ propio / Grabar / sleep timer /
Compartir), each opening its own bottom sheet. "EQ propio" opens a sheet
hosting EcualizadorWidget - the exact same component WU13 restyled for
Settings, bound via the existing presetParaEmisora/guardarPresetPorEmisora
per-station persistence path. No second editor was created; the
multi-device-eq resolution hierarchy is untouched.

pantalla_reproductor.dart had zero test coverage before this commit (907
lines) - writing it first surfaced two pre-existing bugs blocking any
coverage at all, both fixed: initState called estado.reproducir()
directly, which notifies listeners synchronously before its first await
and threw "setState() during build" the instant the screen mounted
against a fresh Provider tree (fixed via addPostFrameCallback); and the
body Column had no scrollable ancestor and overflowed even a generously
tall viewport (fixed by wrapping it in a SingleChildScrollView, a real
UX improvement and not just a test workaround).

The three protected EQ test files (servicio_ecualizador_test.dart,
estado_ecualizador_test.dart, servicio_audio_eq_reapply_test.dart) stay
unmodified. Full suite: 730/730 green (2 skipped, unchanged), up from 713.

size:exception - realized 1,410 changed lines (25 files including this
docs update) against the 450-600 forecast: the restructured screen file
alone is 658 lines (a near-total rewrite of a 907-line file, not a
patch), its new test file (first-ever coverage) is 519 lines, and a new
test fake plus a togglePlay() override account for the rest. Not
splittable: the restructure, the tool tray, and the EQ-sheet wiring are
one cohesive change to one screen.
This commit is contained in:
2026-07-29 14:20:27 +02:00
parent c9fe0ad651
commit dc21732027
20 changed files with 1178 additions and 242 deletions
+2
View File
@@ -701,6 +701,8 @@
"notPlaying": "Not playing",
"oneTimeOption": "Once",
"pausePlaybackTooltip": "Pause playback",
"playerQualityChangeAction": "Change",
"playerToolEqLabel": "Own EQ",
"qualityOriginal": "Original quality: {quality}",
"@qualityOriginal": {
"placeholders": {
+2
View File
@@ -657,6 +657,8 @@
"notPlaying": "No está reproduciendo",
"oneTimeOption": "Una vez",
"pausePlaybackTooltip": "Pausar reproducción",
"playerQualityChangeAction": "Cambiar",
"playerToolEqLabel": "EQ propio",
"qualityOriginal": "Calidad original: {quality}",
"@qualityOriginal": {"placeholders": {"quality": {}}},
"qualityUnknown": "Calidad no informada",
+12
View File
@@ -2480,6 +2480,18 @@ abstract class AppLocalizations {
/// **'Pausar reproducción'**
String get pausePlaybackTooltip;
/// No description provided for @playerQualityChangeAction.
///
/// In es, this message translates to:
/// **'Cambiar'**
String get playerQualityChangeAction;
/// No description provided for @playerToolEqLabel.
///
/// In es, this message translates to:
/// **'EQ propio'**
String get playerToolEqLabel;
/// No description provided for @qualityOriginal.
///
/// In es, this message translates to:
+6
View File
@@ -1360,6 +1360,12 @@ class AppLocalizationsAr extends AppLocalizations {
@override
String get pausePlaybackTooltip => 'إيقاف مؤقت';
@override
String get playerQualityChangeAction => 'Cambiar';
@override
String get playerToolEqLabel => 'EQ propio';
@override
String qualityOriginal(Object quality) {
return 'الجودة الأصلية: $quality';
+6
View File
@@ -1369,6 +1369,12 @@ class AppLocalizationsBn extends AppLocalizations {
@override
String get pausePlaybackTooltip => 'প্লেব্যাক বিরতি';
@override
String get playerQualityChangeAction => 'Cambiar';
@override
String get playerToolEqLabel => 'EQ propio';
@override
String qualityOriginal(Object quality) {
return 'মূল মান: $quality';
+6
View File
@@ -1377,6 +1377,12 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get pausePlaybackTooltip => 'Wiedergabe pausieren';
@override
String get playerQualityChangeAction => 'Cambiar';
@override
String get playerToolEqLabel => 'EQ propio';
@override
String qualityOriginal(Object quality) {
return 'Originalqualität: $quality';
+6
View File
@@ -1361,6 +1361,12 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get pausePlaybackTooltip => 'Pause playback';
@override
String get playerQualityChangeAction => 'Change';
@override
String get playerToolEqLabel => 'Own EQ';
@override
String qualityOriginal(Object quality) {
return 'Original quality: $quality';
+6
View File
@@ -1372,6 +1372,12 @@ class AppLocalizationsEs extends AppLocalizations {
@override
String get pausePlaybackTooltip => 'Pausar reproducción';
@override
String get playerQualityChangeAction => 'Cambiar';
@override
String get playerToolEqLabel => 'EQ propio';
@override
String qualityOriginal(Object quality) {
return 'Calidad original: $quality';
+6
View File
@@ -1382,6 +1382,12 @@ class AppLocalizationsFr extends AppLocalizations {
@override
String get pausePlaybackTooltip => 'Mettre en pause';
@override
String get playerQualityChangeAction => 'Cambiar';
@override
String get playerToolEqLabel => 'EQ propio';
@override
String qualityOriginal(Object quality) {
return 'Qualité dorigine : $quality';
+6
View File
@@ -1367,6 +1367,12 @@ class AppLocalizationsHi extends AppLocalizations {
@override
String get pausePlaybackTooltip => 'प्लेबैक रोकें';
@override
String get playerQualityChangeAction => 'Cambiar';
@override
String get playerToolEqLabel => 'EQ propio';
@override
String qualityOriginal(Object quality) {
return 'मूल गुणवत्ता: $quality';
+6
View File
@@ -1373,6 +1373,12 @@ class AppLocalizationsId extends AppLocalizations {
@override
String get pausePlaybackTooltip => 'Jeda pemutaran';
@override
String get playerQualityChangeAction => 'Cambiar';
@override
String get playerToolEqLabel => 'EQ propio';
@override
String qualityOriginal(Object quality) {
return 'Kualitas asli: $quality';
+6
View File
@@ -1377,6 +1377,12 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get pausePlaybackTooltip => 'Pausa riproduzione';
@override
String get playerQualityChangeAction => 'Cambiar';
@override
String get playerToolEqLabel => 'EQ propio';
@override
String qualityOriginal(Object quality) {
return 'Qualità originale: $quality';
+6
View File
@@ -1329,6 +1329,12 @@ class AppLocalizationsJa extends AppLocalizations {
@override
String get pausePlaybackTooltip => '再生を一時停止';
@override
String get playerQualityChangeAction => 'Cambiar';
@override
String get playerToolEqLabel => 'EQ propio';
@override
String qualityOriginal(Object quality) {
return '元の音質: $quality';
+6
View File
@@ -1369,6 +1369,12 @@ class AppLocalizationsPt extends AppLocalizations {
@override
String get pausePlaybackTooltip => 'Pausar reprodução';
@override
String get playerQualityChangeAction => 'Cambiar';
@override
String get playerToolEqLabel => 'EQ propio';
@override
String qualityOriginal(Object quality) {
return 'Qualidade original: $quality';
+6
View File
@@ -1373,6 +1373,12 @@ class AppLocalizationsRu extends AppLocalizations {
@override
String get pausePlaybackTooltip => 'Пауза';
@override
String get playerQualityChangeAction => 'Cambiar';
@override
String get playerToolEqLabel => 'EQ propio';
@override
String qualityOriginal(Object quality) {
return 'Исходное качество: $quality';
+6
View File
@@ -1324,6 +1324,12 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get pausePlaybackTooltip => '暂停播放';
@override
String get playerQualityChangeAction => 'Cambiar';
@override
String get playerToolEqLabel => 'EQ propio';
@override
String qualityOriginal(Object quality) {
return '原始质量:$quality';