feat(alarm): add musical alarm foundation
This commit is contained in:
@@ -0,0 +1,118 @@
|
||||
import 'package:flutter/foundation.dart';
|
||||
|
||||
import '../modelos/alarma_musical.dart';
|
||||
import '../servicios/servicio_alarmas.dart';
|
||||
import '../servicios/servicio_alarmas_android.dart';
|
||||
|
||||
class EstadoAlarmas extends ChangeNotifier {
|
||||
EstadoAlarmas({
|
||||
ServicioAlarmas? servicio,
|
||||
ServicioAlarmasAndroid? android,
|
||||
bool iniciarAutomaticamente = true,
|
||||
}) : servicio = servicio ?? ServicioAlarmas(),
|
||||
android = android ?? ServicioAlarmasAndroid() {
|
||||
if (iniciarAutomaticamente) {
|
||||
inicializar();
|
||||
}
|
||||
}
|
||||
|
||||
final ServicioAlarmas servicio;
|
||||
final ServicioAlarmasAndroid android;
|
||||
|
||||
List<AlarmaMusical> _alarmas = [];
|
||||
List<RangoVacaciones> _vacaciones = [];
|
||||
DiagnosticoAlarmasAndroid? _diagnostico;
|
||||
bool _cargando = false;
|
||||
String? _error;
|
||||
|
||||
List<AlarmaMusical> get alarmas => List.unmodifiable(_alarmas);
|
||||
List<RangoVacaciones> get vacaciones => List.unmodifiable(_vacaciones);
|
||||
DiagnosticoAlarmasAndroid? get diagnostico => _diagnostico;
|
||||
bool get cargando => _cargando;
|
||||
String? get error => _error;
|
||||
|
||||
AlarmaMusical? get proximaAlarma {
|
||||
final candidatas =
|
||||
_alarmas.where((a) => a.activa && a.proximaEjecucion != null).toList()
|
||||
..sort((a, b) => a.proximaEjecucion!.compareTo(b.proximaEjecucion!));
|
||||
return candidatas.isEmpty ? null : candidatas.first;
|
||||
}
|
||||
|
||||
Future<void> inicializar() async {
|
||||
_cargando = true;
|
||||
_error = null;
|
||||
notifyListeners();
|
||||
try {
|
||||
final config = await servicio.cargar();
|
||||
_aplicar(config);
|
||||
await _sincronizarTodas();
|
||||
await cargarDiagnostico();
|
||||
} catch (e) {
|
||||
_error = 'No se pudieron cargar las alarmas: $e';
|
||||
} finally {
|
||||
_cargando = false;
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> guardarAlarma(AlarmaMusical alarma) async {
|
||||
final config = await servicio.guardarAlarma(alarma);
|
||||
_aplicar(config);
|
||||
await android.programar(_alarmas.firstWhere((a) => a.id == alarma.id));
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
Future<void> eliminarAlarma(String id) async {
|
||||
final config = await servicio.eliminarAlarma(id);
|
||||
_aplicar(config);
|
||||
await android.cancelar(id);
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
Future<void> cambiarActiva(AlarmaMusical alarma, bool activa) async {
|
||||
await guardarAlarma(alarma.copyWith(activa: activa));
|
||||
}
|
||||
|
||||
Future<void> saltarProxima(String alarmaId) async {
|
||||
final config = await servicio.saltarProxima(alarmaId);
|
||||
_aplicar(config);
|
||||
AlarmaMusical? alarma;
|
||||
for (final item in _alarmas) {
|
||||
if (item.id == alarmaId) {
|
||||
alarma = item;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (alarma != null) {
|
||||
await android.programar(alarma);
|
||||
}
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
Future<void> guardarVacaciones(List<RangoVacaciones> vacaciones) async {
|
||||
final config = await servicio.guardarVacaciones(vacaciones);
|
||||
_aplicar(config);
|
||||
await _sincronizarTodas();
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
Future<void> cargarDiagnostico() async {
|
||||
try {
|
||||
_diagnostico = await android.diagnostico();
|
||||
} catch (_) {
|
||||
_diagnostico = null;
|
||||
}
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
Future<void> _sincronizarTodas() async {
|
||||
for (final alarma in _alarmas) {
|
||||
await android.programar(alarma);
|
||||
}
|
||||
}
|
||||
|
||||
void _aplicar(ConfiguracionAlarmas config) {
|
||||
_alarmas = config.alarmas;
|
||||
_vacaciones = config.vacaciones;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user