fix(player): stabilize first playback and refresh design
Build & Deploy Pluriwave / Análisis de código (push) Successful in 12s
Build & Deploy Pluriwave / Build APK + AAB release (push) Successful in 1m20s

This commit is contained in:
2026-05-20 22:50:39 +02:00
parent 22e19d1cb0
commit b9cf42b91c
27 changed files with 131 additions and 31 deletions
+44
View File
@@ -4,6 +4,7 @@ import 'dart:io';
import 'package:flutter_test/flutter_test.dart';
import 'package:pluriwave/estado/estado_radio.dart';
import 'package:pluriwave/modelos/preset_ecualizador.dart';
import 'package:pluriwave/servicios/servicio_audio.dart';
import '../helpers/fakes.dart';
@@ -172,6 +173,49 @@ void main() {
expect(audio.presetsAplicados.last, principal);
});
test('notifica cambios de estado de audio para mostrar reproductor al primer play', () async {
final audio = FakeServicioAudio();
final emisora = emisoraDemo(uuid: 'play-1', nombre: 'Primera');
final estado = EstadoRadio(
audio: audio,
favoritos: FakeServicioFavoritos(),
radio: FakeServicioRadio(populares: [emisora]),
servicioEcualizador: FakeServicioEcualizador(),
resolverArchivoCustom: _archivoCustomVacio,
iniciarAutomaticamente: false,
);
var notificaciones = 0;
estado.addListener(() => notificaciones++);
await estado.inicializar();
final antes = notificaciones;
audio.emitirEstado(EstadoReproduccion.cargando);
await Future<void>.delayed(Duration.zero);
expect(notificaciones, greaterThan(antes));
});
test('reproducir la misma emisora mientras suena no reinicia el stream', () async {
final audio = FakeServicioAudio();
final emisora = emisoraDemo(uuid: 'same-1', nombre: 'Misma');
final estado = EstadoRadio(
audio: audio,
favoritos: FakeServicioFavoritos(),
radio: FakeServicioRadio(populares: [emisora]),
servicioEcualizador: FakeServicioEcualizador(),
resolverArchivoCustom: _archivoCustomVacio,
iniciarAutomaticamente: false,
);
await estado.inicializar();
await estado.reproducir(emisora);
await estado.reproducir(emisora);
expect(audio.emisorasReproducidas, hasLength(1));
});
test('reordenar favoritos reindexa de forma determinística', () async {
final favoritos = FakeServicioFavoritos();
await favoritos.agregar(emisoraDemo(uuid: 'a', nombre: 'A'));
+11 -2
View File
@@ -17,6 +17,7 @@ class FakeServicioAudio extends ServicioAudio {
final List<PresetEcualizador> presetsAplicados = [];
final List<Emisora> emisorasReproducidas = [];
Emisora? _emisoraActual;
EstadoReproduccion _estadoActual = EstadoReproduccion.detenido;
@override
Emisora? get emisoraActual => _emisoraActual;
@@ -27,17 +28,25 @@ class FakeServicioAudio extends ServicioAudio {
@override
Stream<EstadoReproduccion> get estadoStream => _estadoController.stream;
@override
bool get estaSonando => _estadoActual == EstadoReproduccion.reproduciendo;
@override
Future<void> reproducir(Emisora emisora) async {
_emisoraActual = emisora;
emisorasReproducidas.add(emisora);
_estadoController.add(EstadoReproduccion.reproduciendo);
emitirEstado(EstadoReproduccion.reproduciendo);
}
@override
Future<void> detener() async {
_emisoraActual = null;
_estadoController.add(EstadoReproduccion.detenido);
emitirEstado(EstadoReproduccion.detenido);
}
void emitirEstado(EstadoReproduccion estado) {
_estadoActual = estado;
_estadoController.add(estado);
}
@override