fix(alarms): refresh next execution reliably
This commit is contained in:
@@ -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")
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
);
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user