fix(recordings): open last file on android
Build & Deploy Pluriwave / Análisis de código (push) Successful in 23s
Build & Deploy Pluriwave / Build APK + AAB release (push) Failing after 1m2s

This commit is contained in:
2026-05-22 18:30:38 +02:00
parent fde651eee9
commit 809255bd43
8 changed files with 184 additions and 15 deletions
+17 -2
View File
@@ -49,17 +49,20 @@ class EstadoAlarmas extends ChangeNotifier {
}
Future<void> inicializar() async {
debugPrint('[PluriWave][alarmas] inicializar');
_cargando = true;
_error = null;
notifyListeners();
try {
final config = await servicio.cargar();
_aplicar(config);
debugPrint('[PluriWave][alarmas] cargadas=${_alarmas.length} vacaciones=${_vacaciones.length} excepciones=${_excepciones.length}');
await _sincronizarTodas();
await cargarDiagnostico();
_activarRefresco();
} catch (e) {
_error = 'No se pudieron cargar las alarmas: $e';
debugPrint('[PluriWave][alarmas] inicializar ERROR $e');
} finally {
_cargando = false;
notifyListeners();
@@ -67,10 +70,13 @@ class EstadoAlarmas extends ChangeNotifier {
}
Future<void> guardarAlarma(AlarmaMusical alarma) async {
debugPrint('[PluriWave][alarmas] guardar id=${alarma.id} activa=${alarma.activa} hora=${alarma.hora}:${alarma.minuto} tipo=${alarma.tipoProgramacion.name}');
final config = await servicio.guardarAlarma(alarma);
_aplicar(config);
try {
await android.programar(_alarmas.firstWhere((a) => a.id == alarma.id));
final guardada = _alarmas.firstWhere((a) => a.id == alarma.id);
debugPrint('[PluriWave][alarmas] guardada id=${guardada.id} proxima=${guardada.proximaEjecucion?.toIso8601String()}');
await android.programar(guardada);
} catch (e) {
_error =
'Alarma guardada, pero Android no pudo programarla todavía: $e';
@@ -79,6 +85,7 @@ class EstadoAlarmas extends ChangeNotifier {
}
Future<void> refrescarProgramacion() async {
debugPrint('[PluriWave][alarmas] refrescar programacion');
final config = await servicio.recalcularTodas();
_aplicar(config);
await _sincronizarTodas();
@@ -86,6 +93,7 @@ class EstadoAlarmas extends ChangeNotifier {
}
Future<void> eliminarAlarma(String id) async {
debugPrint('[PluriWave][alarmas] eliminar id=$id');
final config = await servicio.eliminarAlarma(id);
_aplicar(config);
await android.cancelar(id);
@@ -97,6 +105,7 @@ class EstadoAlarmas extends ChangeNotifier {
}
Future<void> saltarProxima(String alarmaId) async {
debugPrint('[PluriWave][alarmas] saltar proxima id=$alarmaId');
final config = await servicio.saltarProxima(alarmaId);
_aplicar(config);
AlarmaMusical? alarma;
@@ -113,6 +122,7 @@ class EstadoAlarmas extends ChangeNotifier {
}
Future<void> guardarVacaciones(List<RangoVacaciones> vacaciones) async {
debugPrint('[PluriWave][alarmas] guardar vacaciones count=${vacaciones.length}');
final config = await servicio.guardarVacaciones(vacaciones);
_aplicar(config);
await _sincronizarTodas();
@@ -121,11 +131,13 @@ class EstadoAlarmas extends ChangeNotifier {
Future<void> posponerAlarma(AlarmaMusical alarma, int minutos) async {
final proxima = DateTime.now().add(Duration(minutes: minutos));
debugPrint('[PluriWave][alarmas] posponer id=${alarma.id} minutos=$minutos proxima=${proxima.toIso8601String()}');
await android.ocultarNotificacionAlarma(alarma.id);
await android.programar(alarma.copyWith(proximaEjecucion: proxima));
}
Future<void> finalizarEjecucion(String alarmaId) async {
debugPrint('[PluriWave][alarmas] finalizar ejecucion id=$alarmaId');
await android.ocultarNotificacionAlarma(alarmaId);
await refrescarProgramacion();
}
@@ -150,13 +162,15 @@ class EstadoAlarmas extends ChangeNotifier {
Future<void> cargarDiagnostico() async {
try {
_diagnostico = await android.diagnostico();
} catch (_) {
} catch (e) {
debugPrint('[PluriWave][alarmas] diagnostico ERROR $e');
_diagnostico = null;
}
notifyListeners();
}
Future<void> _sincronizarTodas() async {
debugPrint('[PluriWave][alarmas] sincronizar todas count=${_alarmas.length}');
for (final alarma in _alarmas) {
await android.programar(alarma);
}
@@ -188,6 +202,7 @@ class EstadoAlarmas extends ChangeNotifier {
if (proxima.isAfter(ahora)) continue;
final key = '${alarma.id}:${proxima.millisecondsSinceEpoch}';
if (_ejecucionesEmitidas.add(key)) {
debugPrint('[PluriWave][alarmas] vencida local id=${alarma.id} proxima=${proxima.toIso8601String()}');
_alarmasVencidasController.add(alarma);
}
}
+16 -2
View File
@@ -464,7 +464,7 @@ class EstadoRadio extends ChangeNotifier {
);
}
_resultadosBusqueda = nuevaLista;
// _buscarPaginaFiltrada actualiza offset/hayMas usando p?ginas crudas.
// _buscarPaginaFiltrada actualiza offset/hayMas usando páginas crudas.
_hayMasBusqueda = _hayMasBusqueda && pagina.isNotEmpty;
} catch (_) {
_errorController.add('No se pudieron cargar mas emisoras.');
@@ -644,7 +644,21 @@ class EstadoRadio extends ChangeNotifier {
Future<bool> abrirUltimaGrabacion() async {
final archivo = ultimaGrabacion;
if (archivo == null || !await archivo.exists()) return false;
if (archivo == null || !await archivo.exists()) {
debugPrint('[PluriWave][recordings] last recording missing');
return false;
}
debugPrint('[PluriWave][recordings] opening last file: ${archivo.path}');
if (!kIsWeb && Platform.isAndroid) {
final abierto = await _fileActionsChannel.invokeMethod<bool>(
'openFile',
{
'path': archivo.path,
'mimeType': 'audio/*',
},
);
return abierto ?? false;
}
return launchUrl(
Uri.file(archivo.path),
mode: LaunchMode.externalApplication,
+27 -4
View File
@@ -1,5 +1,6 @@
import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart';
import '../modelos/alarma_musical.dart';
@@ -64,9 +65,15 @@ class ServicioAlarmasAndroid {
Future<void> programar(AlarmaMusical alarma) async {
final proxima = alarma.proximaEjecucion;
if (proxima == null || !alarma.activa) {
debugPrint(
'[PluriWave][alarmas] cancelar por inactiva/sin proxima id=${alarma.id} activa=${alarma.activa} proxima=$proxima',
);
await cancelar(alarma.id);
return;
}
debugPrint(
'[PluriWave][alarmas] programar id=${alarma.id} nombre=${alarma.nombre} proxima=${proxima.toIso8601String()} preaviso=${proxima.subtract(const Duration(minutes: 30)).toIso8601String()}',
);
await _channel.invokeMethod<void>('scheduleAlarm', {
'id': alarma.id,
'title': alarma.nombre,
@@ -77,16 +84,21 @@ class ServicioAlarmasAndroid {
}
Future<void> cancelar(String alarmaId) =>
_channel.invokeMethod<void>('cancelAlarm', {'id': alarmaId});
_logAndInvokeVoid('cancelAlarm', {'id': alarmaId});
Future<void> ocultarNotificacionAlarma(String alarmaId) => _channel
.invokeMethod<void>('dismissAlarmNotification', {'id': alarmaId});
Future<void> ocultarNotificacionAlarma(String alarmaId) =>
_logAndInvokeVoid('dismissAlarmNotification', {'id': alarmaId});
Future<DiagnosticoAlarmasAndroid> diagnostico() async {
debugPrint('[PluriWave][alarmas] diagnostico android');
final raw = await _channel.invokeMethod<Map<Object?, Object?>>(
'diagnostics',
);
return DiagnosticoAlarmasAndroid.fromMap(raw ?? const {});
final diag = DiagnosticoAlarmasAndroid.fromMap(raw ?? const {});
debugPrint(
'[PluriWave][alarmas] diagnostico exactas=${diag.puedeProgramarExactas} notificaciones=${diag.notificacionesPermitidas} sdk=${diag.versionSdk} fabricante=${diag.fabricante}',
);
return diag;
}
Future<EventoAlarmaAndroid?> obtenerEventoInicial() async {
@@ -95,9 +107,17 @@ class ServicioAlarmasAndroid {
);
if (raw == null || raw.isEmpty) return null;
final evento = EventoAlarmaAndroid.fromMap(raw);
debugPrint(
'[PluriWave][alarmas] evento inicial id=${evento.alarmaId} accion=${evento.accion}',
);
return evento.alarmaId.isEmpty ? null : evento;
}
Future<void> _logAndInvokeVoid(String method, Map<String, Object?> args) {
debugPrint('[PluriWave][alarmas] $method $args');
return _channel.invokeMethod<void>(method, args);
}
static void _instalarHandler(MethodChannel channel) {
if (_handlerInstalado) return;
_handlerInstalado = true;
@@ -107,6 +127,9 @@ class ServicioAlarmasAndroid {
if (args is Map) {
final evento = EventoAlarmaAndroid.fromMap(args);
if (evento.alarmaId.isNotEmpty) {
debugPrint(
'[PluriWave][alarmas] evento nativo id=${evento.alarmaId} accion=${evento.accion}',
);
_eventosController.add(evento);
}
}