diff --git a/app/src/androidTest/java/com/todoroo/astrid/alarms/AlarmJobServiceTest.kt b/app/src/androidTest/java/com/todoroo/astrid/alarms/AlarmJobServiceTest.kt index d428b8405..0cb5f0b87 100644 --- a/app/src/androidTest/java/com/todoroo/astrid/alarms/AlarmJobServiceTest.kt +++ b/app/src/androidTest/java/com/todoroo/astrid/alarms/AlarmJobServiceTest.kt @@ -144,6 +144,41 @@ class AlarmJobServiceTest : InjectingTestCase() { } } + @Test + fun alarmsOneMinuteApart() = runBlocking { + freezeAt(DateTime(2024, 5, 17, 23, 20)) { + taskDao.insert( + Task( + dueDate = createDueDate( + Task.URGENCY_SPECIFIC_DAY_TIME, + DateTime(2024, 5, 17, 23, 20).millis + ) + ) + ) + alarmService.synchronizeAlarms(1, mutableSetOf(Alarm(type = Alarm.TYPE_REL_END))) + taskDao.insert(Task()) + alarmService.synchronizeAlarms( + taskId = 2, + alarms = mutableSetOf( + Alarm( + type = Alarm.TYPE_SNOOZE, + time = DateTime(2024, 5, 17, 23, 21).millis) + ) + ) + + testResults( + listOf( + Notification( + taskId = 1L, + timestamp = DateTimeUtils2.currentTimeMillis(), + type = Alarm.TYPE_REL_END + ) + ), + DateTime(2024, 5, 17, 23, 21).millis + ) + } + } + @Test fun futureSnoozeOverrideOverdue() = runBlocking { freezeAt(DateTime(2024, 5, 17, 23, 20)) { diff --git a/app/src/main/java/com/todoroo/astrid/alarms/AlarmCalculator.kt b/app/src/main/java/com/todoroo/astrid/alarms/AlarmCalculator.kt index 0eb20ffd6..1dc869f42 100644 --- a/app/src/main/java/com/todoroo/astrid/alarms/AlarmCalculator.kt +++ b/app/src/main/java/com/todoroo/astrid/alarms/AlarmCalculator.kt @@ -73,15 +73,15 @@ class AlarmCalculator( * We take the last reminder time and add approximately the reminder period. If it's still in * the past, we set it to some time in the near future. */ - private fun calculateNextRandomReminder(random: Random, task: Task, reminderPeriod: Long): Long { + private fun calculateNextRandomReminder(random: Random, task: Task, reminderPeriod: Long) = if (reminderPeriod > 0) { - var `when` = task.reminderLast - if (`when` == 0L) { - `when` = task.creationDate - } - `when` += (reminderPeriod * (0.85f + 0.3f * random.nextFloat())).toLong() - return Math.max(`when`, task.hideUntil) + maxOf( + task.reminderLast + .coerceAtLeast(task.creationDate) + .plus((reminderPeriod * (0.85f + 0.3f * random.nextFloat())).toLong()), + task.hideUntil + ) + } else { + AlarmService.NO_ALARM } - return AlarmService.NO_ALARM - } } \ No newline at end of file diff --git a/app/src/main/java/com/todoroo/astrid/alarms/AlarmService.kt b/app/src/main/java/com/todoroo/astrid/alarms/AlarmService.kt index 1696a2c17..4929d6634 100644 --- a/app/src/main/java/com/todoroo/astrid/alarms/AlarmService.kt +++ b/app/src/main/java/com/todoroo/astrid/alarms/AlarmService.kt @@ -104,7 +104,9 @@ class AlarmService @Inject constructor( val alarmEntries = alarms.mapNotNull { alarmCalculator.toAlarmEntry(task, it) } - val (now, later) = alarmEntries.partition { it.timestamp <= DateTime().startOfMinute().plusMinutes(1).millis } + val (now, later) = alarmEntries.partition { + it.timestamp < DateTime().startOfMinute().plusMinutes(1).millis + } later .filter { it.type == TYPE_SNOOZE } .maxByOrNull { it.timestamp }