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")
|
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")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -250,13 +250,15 @@ class ServicioAlarmas {
|
|||||||
List<RangoVacaciones> vacaciones,
|
List<RangoVacaciones> vacaciones,
|
||||||
List<ExcepcionAlarma> excepciones,
|
List<ExcepcionAlarma> excepciones,
|
||||||
) {
|
) {
|
||||||
return alarma.copyWith(
|
final proxima = _programacion.calcularProxima(
|
||||||
proximaEjecucion: _programacion.calcularProxima(
|
|
||||||
alarma: alarma,
|
alarma: alarma,
|
||||||
desde: _reloj(),
|
desde: _reloj(),
|
||||||
vacaciones: vacaciones,
|
vacaciones: vacaciones,
|
||||||
excepciones: excepciones,
|
excepciones: excepciones,
|
||||||
),
|
);
|
||||||
|
return alarma.copyWith(
|
||||||
|
proximaEjecucion: proxima,
|
||||||
|
limpiarProximaEjecucion: true,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user