fix(alarms): refresh next execution reliably
Build & Deploy Pluriwave / Build APK + AAB release (push) Failing after 1m0s
Build & Deploy Pluriwave / Análisis de código (push) Successful in 23s

This commit is contained in:
2026-05-22 18:41:57 +02:00
parent eb185231a1
commit a48dd6ddf9
5 changed files with 50 additions and 8 deletions
@@ -47,7 +47,8 @@ class AlarmScheduler(private val context: Context) {
) )
Log.d(tag, "alarm.schedule setAlarmClock OK id=$id") Log.d(tag, "alarm.schedule setAlarmClock OK id=$id")
if (preNoticeAtMillis > System.currentTimeMillis()) { val now = System.currentTimeMillis()
if (preNoticeAtMillis > now) {
try { try {
alarmManager.setExactAndAllowWhileIdle( alarmManager.setExactAndAllowWhileIdle(
AlarmManager.RTC_WAKEUP, AlarmManager.RTC_WAKEUP,
@@ -68,6 +69,15 @@ class AlarmScheduler(private val context: Context) {
// The main alarm is already scheduled with setAlarmClock. // The main alarm is already scheduled with setAlarmClock.
Log.w(tag, "alarm.schedule preNotice SecurityException id=$id") Log.w(tag, "alarm.schedule preNotice SecurityException id=$id")
} }
} else if (triggerAtMillis > now) {
context.sendBroadcast(
Intent(context, PluriWaveAlarmReceiver::class.java).apply {
action = PluriWaveAlarmReceiver.ACTION_PRE_NOTICE
putExtra(PluriWaveAlarmReceiver.EXTRA_ALARM_ID, id)
putExtra(PluriWaveAlarmReceiver.EXTRA_ALARM_TITLE, title)
}
)
Log.d(tag, "alarm.schedule preNotice immediate id=$id")
} else { } else {
Log.d(tag, "alarm.schedule preNotice skipped id=$id") Log.d(tag, "alarm.schedule preNotice skipped id=$id")
} }
+3
View File
@@ -88,6 +88,9 @@ class EstadoAlarmas extends ChangeNotifier {
debugPrint('[PluriWave][alarmas] refrescar programacion'); debugPrint('[PluriWave][alarmas] refrescar programacion');
final config = await servicio.recalcularTodas(); final config = await servicio.recalcularTodas();
_aplicar(config); _aplicar(config);
debugPrint(
'[PluriWave][alarmas] proxima tras refrescar=${proximaAlarma?.id} ${proximaAlarma?.proximaEjecucion?.toIso8601String()}',
);
await _sincronizarTodas(); await _sincronizarTodas();
notifyListeners(); notifyListeners();
} }
+5 -1
View File
@@ -60,6 +60,7 @@ class AlarmaMusical {
double? volumen, double? volumen,
SonidoInternoAlarma? sonidoInterno, SonidoInternoAlarma? sonidoInterno,
DateTime? proximaEjecucion, DateTime? proximaEjecucion,
bool limpiarProximaEjecucion = false,
DateTime? creadaEn, DateTime? creadaEn,
DateTime? actualizadaEn, DateTime? actualizadaEn,
}) { }) {
@@ -78,7 +79,10 @@ class AlarmaMusical {
snoozeMinutos: snoozeMinutos ?? this.snoozeMinutos, snoozeMinutos: snoozeMinutos ?? this.snoozeMinutos,
volumen: volumen ?? this.volumen, volumen: volumen ?? this.volumen,
sonidoInterno: sonidoInterno ?? this.sonidoInterno, sonidoInterno: sonidoInterno ?? this.sonidoInterno,
proximaEjecucion: proximaEjecucion ?? this.proximaEjecucion, proximaEjecucion:
limpiarProximaEjecucion
? proximaEjecucion
: proximaEjecucion ?? this.proximaEjecucion,
creadaEn: creadaEn ?? this.creadaEn, creadaEn: creadaEn ?? this.creadaEn,
actualizadaEn: actualizadaEn ?? this.actualizadaEn, actualizadaEn: actualizadaEn ?? this.actualizadaEn,
); );
+8 -6
View File
@@ -250,13 +250,15 @@ class ServicioAlarmas {
List<RangoVacaciones> vacaciones, List<RangoVacaciones> vacaciones,
List<ExcepcionAlarma> excepciones, List<ExcepcionAlarma> excepciones,
) { ) {
final proxima = _programacion.calcularProxima(
alarma: alarma,
desde: _reloj(),
vacaciones: vacaciones,
excepciones: excepciones,
);
return alarma.copyWith( return alarma.copyWith(
proximaEjecucion: _programacion.calcularProxima( proximaEjecucion: proxima,
alarma: alarma, limpiarProximaEjecucion: true,
desde: _reloj(),
vacaciones: vacaciones,
excepciones: excepciones,
),
); );
} }
@@ -1,6 +1,8 @@
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:pluriwave/modelos/alarma_musical.dart'; import 'package:pluriwave/modelos/alarma_musical.dart';
import 'package:pluriwave/servicios/servicio_alarmas.dart';
import 'package:pluriwave/servicios/servicio_programacion_alarmas.dart'; import 'package:pluriwave/servicios/servicio_programacion_alarmas.dart';
import 'package:shared_preferences/shared_preferences.dart';
void main() { void main() {
group('ServicioProgramacionAlarmas', () { group('ServicioProgramacionAlarmas', () {
@@ -83,5 +85,26 @@ void main() {
DateTime(2026, 5, 21, 7, 5), DateTime(2026, 5, 21, 7, 5),
); );
}); });
test('servicio limpia proxima ejecucion obsoleta al recalcular unica vencida', () async {
SharedPreferences.setMockInitialValues({});
final servicioAlarmas = ServicioAlarmas(
reloj: () => DateTime(2026, 5, 22, 10),
);
final alarma = AlarmaMusical(
id: 'a4',
nombre: 'Unica vencida',
hora: 9,
minuto: 0,
tipoProgramacion: TipoProgramacionAlarma.unica,
diasSemana: const [],
fechaUnica: DateTime(2026, 5, 22),
proximaEjecucion: DateTime(2026, 5, 22, 9),
);
final guardada = await servicioAlarmas.guardarAlarma(alarma);
expect(guardada.alarmas.single.proximaEjecucion, isNull);
});
}); });
} }