feat(alarm): complete musical alarm flows
This commit is contained in:
@@ -3,7 +3,9 @@ import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'estado/estado_radio.dart';
|
||||
import 'estado/estado_alarmas.dart';
|
||||
import 'modelos/alarma_musical.dart';
|
||||
import 'pantallas/pantalla_alarmas.dart';
|
||||
import 'pantallas/pantalla_alarma_sonando.dart';
|
||||
import 'pantallas/pantalla_inicio.dart';
|
||||
import 'pantallas/pantalla_buscar.dart';
|
||||
import 'pantallas/pantalla_favoritos.dart';
|
||||
@@ -13,6 +15,7 @@ import 'widgets/pluri_glass_surface.dart';
|
||||
import 'widgets/pluri_icon.dart';
|
||||
import 'widgets/pluri_wave_scaffold.dart';
|
||||
import 'package:pluriwave/widgets/mini_reproductor.dart';
|
||||
import 'servicios/servicio_alarmas_android.dart';
|
||||
|
||||
class PluriWaveApp extends StatelessWidget {
|
||||
const PluriWaveApp({super.key});
|
||||
@@ -46,7 +49,9 @@ class _PaginaPrincipal extends StatefulWidget {
|
||||
class _PaginaPrincipalState extends State<_PaginaPrincipal> {
|
||||
int _indice = 0;
|
||||
StreamSubscription<String>? _errorSubscription;
|
||||
StreamSubscription<EventoAlarmaAndroid>? _alarmaSubscription;
|
||||
EstadoRadio? _estadoSuscrito;
|
||||
bool _alarmaInicialProcesada = false;
|
||||
|
||||
static const _paginas = [
|
||||
PantallaInicio(),
|
||||
@@ -118,11 +123,22 @@ class _PaginaPrincipalState extends State<_PaginaPrincipal> {
|
||||
),
|
||||
);
|
||||
});
|
||||
|
||||
final alarmas = context.read<EstadoAlarmas>();
|
||||
_alarmaSubscription ??= alarmas.android.eventosAlarma.listen((evento) {
|
||||
if (!mounted) return;
|
||||
_abrirAlarmaSonando(evento);
|
||||
});
|
||||
if (!_alarmaInicialProcesada) {
|
||||
_alarmaInicialProcesada = true;
|
||||
unawaited(_procesarAlarmaInicial(alarmas));
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_errorSubscription?.cancel();
|
||||
_alarmaSubscription?.cancel();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@@ -165,6 +181,47 @@ class _PaginaPrincipalState extends State<_PaginaPrincipal> {
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> _procesarAlarmaInicial(EstadoAlarmas alarmas) async {
|
||||
final evento = await alarmas.android.obtenerEventoInicial();
|
||||
if (evento != null && mounted) {
|
||||
await _abrirAlarmaSonando(evento);
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _abrirAlarmaSonando(EventoAlarmaAndroid evento) async {
|
||||
final estado = context.read<EstadoAlarmas>();
|
||||
await estado.refrescarProgramacion();
|
||||
AlarmaMusical? alarma;
|
||||
for (final item in estado.alarmas) {
|
||||
if (item.id == evento.alarmaId) {
|
||||
alarma = item;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (alarma == null || !mounted) return;
|
||||
if (evento.accion.endsWith('.SKIP_NEXT')) {
|
||||
await estado.saltarProxima(alarma.id);
|
||||
if (!mounted) return;
|
||||
setState(() => _indice = 3);
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(
|
||||
content: Text('Omitida esta ejecución de ${alarma.nombre}.'),
|
||||
),
|
||||
);
|
||||
return;
|
||||
}
|
||||
if (evento.accion.endsWith('.PRE_NOTICE')) {
|
||||
setState(() => _indice = 3);
|
||||
return;
|
||||
}
|
||||
await Navigator.of(context).push(
|
||||
MaterialPageRoute<void>(
|
||||
builder: (_) => PantallaAlarmaSonando(alarma: alarma!),
|
||||
fullscreenDialog: true,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
void _mostrarTimerDialog(BuildContext context) {
|
||||
final estado = context.read<EstadoRadio>();
|
||||
showModalBottomSheet(
|
||||
|
||||
Reference in New Issue
Block a user