import 'dart:async'; import 'package:pluriwave/modelos/alarma_musical.dart'; import 'package:pluriwave/servicios/servicio_alarmas_android.dart'; import 'package:pluriwave/servicios/servicio_grabacion_radio.dart'; /// Shared fake of the Android alarm bridge for alarm-related tests. class FakePuertoAlarmasAndroid implements PuertoAlarmasAndroid { final programadas = []; final canceladas = []; final detenidas = []; final ocultadas = []; final ejecucionesNativas = []; final snoozesNativos = []; final _eventos = StreamController.broadcast(); bool ignoraOptimizacionBateria = true; int solicitudesExencionBateria = 0; /// Simulates a native -> Flutter `alarmFired` MethodChannel event. void emitirEvento(EventoAlarmaAndroid evento) => _eventos.add(evento); @override Stream get eventosAlarma => _eventos.stream; @override Future programar(AlarmaMusical alarma) async { programadas.add(alarma); } @override Future cancelar(String alarmaId) async { canceladas.add(alarmaId); } @override Future detenerSonidoNativo(String alarmaId) async { detenidas.add(alarmaId); } @override Future ocultarNotificacionAlarma(String alarmaId) async { ocultadas.add(alarmaId); } @override Future confirmarAudioFlutter(String alarmaId) async { detenidas.add(alarmaId); } @override Future diagnostico() async => DiagnosticoAlarmasAndroid( puedeProgramarExactas: true, notificacionesPermitidas: true, puedeUsarPantallaCompleta: true, ignoraOptimizacionBateria: ignoraOptimizacionBateria, alarmasNativasPendientes: 0, fabricante: 'test', versionSdk: 35, ); @override Future solicitarExencionBateria() async { solicitudesExencionBateria++; return true; } @override Future obtenerEventoInicial() async => null; @override Future> obtenerEjecucionesNativasGestionadas() async => ejecucionesNativas; @override Future> obtenerEstadoSnoozeNativo() async => List.of(snoozesNativos); @override Future solicitarPermisoAlarmasExactas() async => true; @override Future solicitarPermisoNotificaciones() async => true; @override Future solicitarPermisoPantallaCompleta() async => true; Future dispose() => _eventos.close(); } /// Inactive recording service fake, safe for widget tests. class FakeServicioGrabacionRadioInactiva extends ServicioGrabacionRadio { final _controller = StreamController.broadcast(); @override EstadoGrabacionRadio get estado => const EstadoGrabacionRadio.inactiva(); @override Stream get estadoStream => _controller.stream; @override Future inicializar() async {} @override Future dispose() => _controller.close(); }