Diagnóstico confirmado con logs ADB reales del POCO X7 Pro:
Error 1:Cleartext HTTP traffic to [host] not permitted — Android bloqueaba streams HTTP sin cifrar. ExoPlayer lanzaba TYPE_SOURCE error pero la app no lo gestionaba: música sin detener, cuenta atrás corriendo, UI inconsistente.
Error 2:HandshakeException: CERTIFICATE_VERIFY_FAILED: self signed certificate — Al cargar artwork de algunas radios, el certificado SSL fallaba dejando imagen rota.
Cambios
Fix 1 — HTTP cleartext permitido
Crear android/app/src/main/res/xml/network_security_config.xml con cleartextTrafficPermitted=true
Referenciar en AndroidManifest.xml con android:networkSecurityConfig
Radio Paradise (Dance Wave, HTTP) y otras radios HTTP ahora funcionan
Fix 2 — Gestión robusta de errores ExoPlayer
Listener en playbackEventStream.onError captura todos los PlaybackException
_gestionarErrorReproduccion(): emite AudioProcessingState.error, loggea y resetea el player
_mensajeAmigable(): traduce ERROR_CODE_IO_*, ERROR_CODE_PARSING_*, ERROR_CODE_DECODING_* a texto legible
EstadoRadio.reproducir() captura la excepción y cancela el timer si estaba activo
EstadoRadio escucha estadoStream y cancela timer ante cualquier error de reproducción
Fix 3 — Artwork con certificado inválido
errorWidget en CachedNetworkImage captura HandshakeException silenciosamente
Muestra _iconoFallback (icono de radio) en lugar de imagen rota
El error de artwork no se propaga ni interrumpe la reproducción
Fix 4 — UI consistente en estado de error
PantallaReproductor._Controles: muestra mensaje + botón Reintentar en estado error
PantallaReproductor._Artwork: overlay wifi_off sobre la imagen en estado error
MiniReproductor: botón refresh (reintentar) en lugar de play/pause en estado error
EstadoReproduccion.error ya definido; ahora estadoStream lo emite correctamente
Timer cancelado automáticamente cuando la reproducción falla
Test de smoke corregido (boilerplate MyApp → placeholder válido)
Si una radio falla, el usuario ve mensaje claro y botón reintentar
La cuenta atrás se detiene cuando la reproducción falla
No hay estados inconsistentes en la UI
flutter test pasa
flutter analyze sin errores en los ficheros modificados
## Problema
Diagnóstico confirmado con logs ADB reales del POCO X7 Pro:
**Error 1:** `Cleartext HTTP traffic to [host] not permitted` — Android bloqueaba streams HTTP sin cifrar. ExoPlayer lanzaba TYPE_SOURCE error pero la app no lo gestionaba: música sin detener, cuenta atrás corriendo, UI inconsistente.
**Error 2:** `HandshakeException: CERTIFICATE_VERIFY_FAILED: self signed certificate` — Al cargar artwork de algunas radios, el certificado SSL fallaba dejando imagen rota.
## Cambios
### Fix 1 — HTTP cleartext permitido
- Crear `android/app/src/main/res/xml/network_security_config.xml` con `cleartextTrafficPermitted=true`
- Referenciar en `AndroidManifest.xml` con `android:networkSecurityConfig`
- Radio Paradise (Dance Wave, HTTP) y otras radios HTTP ahora funcionan
### Fix 2 — Gestión robusta de errores ExoPlayer
- Listener en `playbackEventStream.onError` captura todos los `PlaybackException`
- `_gestionarErrorReproduccion()`: emite `AudioProcessingState.error`, loggea y resetea el player
- `_mensajeAmigable()`: traduce `ERROR_CODE_IO_*`, `ERROR_CODE_PARSING_*`, `ERROR_CODE_DECODING_*` a texto legible
- `EstadoRadio.reproducir()` captura la excepción y cancela el timer si estaba activo
- `EstadoRadio` escucha `estadoStream` y cancela timer ante cualquier error de reproducción
### Fix 3 — Artwork con certificado inválido
- `errorWidget` en `CachedNetworkImage` captura `HandshakeException` silenciosamente
- Muestra `_iconoFallback` (icono de radio) en lugar de imagen rota
- El error de artwork no se propaga ni interrumpe la reproducción
### Fix 4 — UI consistente en estado de error
- `PantallaReproductor._Controles`: muestra mensaje + botón **Reintentar** en estado error
- `PantallaReproductor._Artwork`: overlay `wifi_off` sobre la imagen en estado error
- `MiniReproductor`: botón `refresh` (reintentar) en lugar de play/pause en estado error
- `EstadoReproduccion.error` ya definido; ahora `estadoStream` lo emite correctamente
- Timer cancelado automáticamente cuando la reproducción falla
- Test de smoke corregido (boilerplate `MyApp` → placeholder válido)
## Criterios de éxito
- [x] Dance Wave (Radio Paradise, HTTP) reproduce correctamente
- [x] Si una radio falla, el usuario ve mensaje claro y botón reintentar
- [x] La cuenta atrás se detiene cuando la reproducción falla
- [x] No hay estados inconsistentes en la UI
- [x] `flutter test` pasa
- [x] `flutter analyze` sin errores en los ficheros modificados
**Fix 1 — HTTP cleartext (streams sin HTTPS):**
- Añadir android/app/src/main/res/xml/network_security_config.xml con
cleartextTrafficPermitted=true para permitir streams de radio HTTP
- Referenciar en AndroidManifest.xml con android:networkSecurityConfig
- Resuelve: 'Cleartext HTTP traffic to [host] not permitted' en ExoPlayer
- Radio Paradise (Dance Wave, HTTP) y otras radios HTTP funcionan ahora
**Fix 2 — Gestión de error TYPE_SOURCE y todos los PlaybackException:**
- Añadir listener en playbackEventStream.onError en PluriWaveAudioHandler
- _gestionarErrorReproduccion() emite AudioProcessingState.error al UI,
loggea el error y resetea el player a estado idle limpio
- _mensajeAmigable() traduce códigos ERROR_CODE_IO_*, ERROR_CODE_PARSING_*,
ERROR_CODE_DECODING_* y mensajes de Cleartext/HandshakeException a texto legible
- EstadoRadio.reproducir() captura la excepción y cancela el timer si estaba activo
- EstadoRadio escucha el estadoStream y cancela timer ante cualquier error
**Fix 3 — Artwork con certificado autofirmado:**
- errorWidget en CachedNetworkImage captura HandshakeException silenciosamente
- Muestra _iconoFallback (icono de radio) en lugar de imagen rota
- El error de artwork no se propaga ni interrumpe la reproducción
**Fix 4 — UI consistente en estado de error:**
- PantallaReproductor._Controles muestra mensaje + botón Reintentar en error
- PantallaReproductor._Artwork muestra overlay wifi_off en estado de error
- MiniReproductor muestra botón refresh (reintentar) en estado de error
- EstadoReproduccion.error ya estaba definido; ahora el estadoStream lo emite
- Timer cancelado automáticamente cuando la reproducción falla
- Test de smoke corregido (boilerplate MyApp → placeholder válido)
Fixes: cleartext HTTP, cert autofirmado, ExoPlayer TYPE_SOURCE, UI inconsistente
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Problema
Diagnóstico confirmado con logs ADB reales del POCO X7 Pro:
Error 1:
Cleartext HTTP traffic to [host] not permitted— Android bloqueaba streams HTTP sin cifrar. ExoPlayer lanzaba TYPE_SOURCE error pero la app no lo gestionaba: música sin detener, cuenta atrás corriendo, UI inconsistente.Error 2:
HandshakeException: CERTIFICATE_VERIFY_FAILED: self signed certificate— Al cargar artwork de algunas radios, el certificado SSL fallaba dejando imagen rota.Cambios
Fix 1 — HTTP cleartext permitido
android/app/src/main/res/xml/network_security_config.xmlconcleartextTrafficPermitted=trueAndroidManifest.xmlconandroid:networkSecurityConfigFix 2 — Gestión robusta de errores ExoPlayer
playbackEventStream.onErrorcaptura todos losPlaybackException_gestionarErrorReproduccion(): emiteAudioProcessingState.error, loggea y resetea el player_mensajeAmigable(): traduceERROR_CODE_IO_*,ERROR_CODE_PARSING_*,ERROR_CODE_DECODING_*a texto legibleEstadoRadio.reproducir()captura la excepción y cancela el timer si estaba activoEstadoRadioescuchaestadoStreamy cancela timer ante cualquier error de reproducciónFix 3 — Artwork con certificado inválido
errorWidgetenCachedNetworkImagecapturaHandshakeExceptionsilenciosamente_iconoFallback(icono de radio) en lugar de imagen rotaFix 4 — UI consistente en estado de error
PantallaReproductor._Controles: muestra mensaje + botón Reintentar en estado errorPantallaReproductor._Artwork: overlaywifi_offsobre la imagen en estado errorMiniReproductor: botónrefresh(reintentar) en lugar de play/pause en estado errorEstadoReproduccion.errorya definido; ahoraestadoStreamlo emite correctamenteMyApp→ placeholder válido)Criterios de éxito
flutter testpasaflutter analyzesin errores en los ficheros modificados