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")
if (preNoticeAtMillis > System.currentTimeMillis()) {
val now = System.currentTimeMillis()
if (preNoticeAtMillis > now) {
try {
alarmManager.setExactAndAllowWhileIdle(
AlarmManager.RTC_WAKEUP,
@@ -68,6 +69,15 @@ class AlarmScheduler(private val context: Context) {
// The main alarm is already scheduled with setAlarmClock.
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 {
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');
final config = await servicio.recalcularTodas();
_aplicar(config);
debugPrint(
'[PluriWave][alarmas] proxima tras refrescar=${proximaAlarma?.id} ${proximaAlarma?.proximaEjecucion?.toIso8601String()}',
);
await _sincronizarTodas();
notifyListeners();
}
+5 -1
View File
@@ -60,6 +60,7 @@ class AlarmaMusical {
double? volumen,
SonidoInternoAlarma? sonidoInterno,
DateTime? proximaEjecucion,
bool limpiarProximaEjecucion = false,
DateTime? creadaEn,
DateTime? actualizadaEn,
}) {
@@ -78,7 +79,10 @@ class AlarmaMusical {
snoozeMinutos: snoozeMinutos ?? this.snoozeMinutos,
volumen: volumen ?? this.volumen,
sonidoInterno: sonidoInterno ?? this.sonidoInterno,
proximaEjecucion: proximaEjecucion ?? this.proximaEjecucion,
proximaEjecucion:
limpiarProximaEjecucion
? proximaEjecucion
: proximaEjecucion ?? this.proximaEjecucion,
creadaEn: creadaEn ?? this.creadaEn,
actualizadaEn: actualizadaEn ?? this.actualizadaEn,
);
+8 -6
View File
@@ -250,13 +250,15 @@ class ServicioAlarmas {
List<RangoVacaciones> vacaciones,
List<ExcepcionAlarma> excepciones,
) {
final proxima = _programacion.calcularProxima(
alarma: alarma,
desde: _reloj(),
vacaciones: vacaciones,
excepciones: excepciones,
);
return alarma.copyWith(
proximaEjecucion: _programacion.calcularProxima(
alarma: alarma,
desde: _reloj(),
vacaciones: vacaciones,
excepciones: excepciones,
),
proximaEjecucion: proxima,
limpiarProximaEjecucion: true,
);
}
@@ -1,6 +1,8 @@
import 'package:flutter_test/flutter_test.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:shared_preferences/shared_preferences.dart';
void main() {
group('ServicioProgramacionAlarmas', () {
@@ -83,5 +85,26 @@ void main() {
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);
});
});
}