diff --git a/src/androidTest/java/org/tasks/jobs/JobQueueTest.java b/src/androidTest/java/org/tasks/jobs/JobQueueTest.java index 29b8ee066..28652db9b 100644 --- a/src/androidTest/java/org/tasks/jobs/JobQueueTest.java +++ b/src/androidTest/java/org/tasks/jobs/JobQueueTest.java @@ -142,7 +142,39 @@ public class JobQueueTest { Freeze.freezeAt(now).thawAfter(new Snippet() {{ assertEquals( singletonList(new Reminder(1, now, TYPE_DUE)), - queue.removeOverdueJobs()); + queue.getOverdueJobs()); + }}); + } + + @Test + public void twoOverdueJobsAtSameTimeReturned() { + long now = currentTimeMillis(); + + queue.add(new Reminder(1, now, TYPE_DUE)); + queue.add(new Reminder(2, now, TYPE_DUE)); + + verify(jobManager).schedule(TAG, now); + + Freeze.freezeAt(now).thawAfter(new Snippet() {{ + assertEquals( + asList(new Reminder(1, now, TYPE_DUE), new Reminder(2, now, TYPE_DUE)), + queue.getOverdueJobs()); + }}); + } + + @Test + public void twoOverdueJobsAtDifferentTimes() { + long now = currentTimeMillis(); + + queue.add(new Reminder(1, now, TYPE_DUE)); + queue.add(new Reminder(2, now + ONE_MINUTE, TYPE_DUE)); + + verify(jobManager).schedule(TAG, now); + + Freeze.freezeAt(now + 2 * ONE_MINUTE).thawAfter(new Snippet() {{ + assertEquals( + asList(new Reminder(1, now, TYPE_DUE), new Reminder(2, now + ONE_MINUTE, TYPE_DUE)), + queue.getOverdueJobs()); }}); } @@ -156,7 +188,7 @@ public class JobQueueTest { verify(jobManager).schedule(TAG, now); Freeze.freezeAt(now).thawAfter(new Snippet() {{ - queue.removeOverdueJobs(); + queue.remove(new Reminder(1, now, TYPE_DUE)); }}); assertEquals( @@ -175,7 +207,8 @@ public class JobQueueTest { verify(jobManager).schedule(TAG, now); Freeze.freezeAt(now + ONE_MINUTE).thawAfter(new Snippet() {{ - queue.removeOverdueJobs(); + queue.remove(new Reminder(1, now, TYPE_DUE)); + queue.remove(new Reminder(2, now + ONE_MINUTE, TYPE_DUE)); }}); assertEquals( diff --git a/src/main/java/com/todoroo/astrid/alarms/AlarmService.java b/src/main/java/com/todoroo/astrid/alarms/AlarmService.java index ea477f47d..8ea0e7407 100644 --- a/src/main/java/com/todoroo/astrid/alarms/AlarmService.java +++ b/src/main/java/com/todoroo/astrid/alarms/AlarmService.java @@ -189,7 +189,11 @@ public class AlarmService { jobs.scheduleNext(); } - public List removePastDueAlarms() { - return jobs.removeOverdueJobs(); + public List getOverdueAlarms() { + return jobs.getOverdueJobs(); + } + + public boolean remove(Alarm alarm) { + return jobs.remove(alarm); } } diff --git a/src/main/java/com/todoroo/astrid/reminders/ReminderService.java b/src/main/java/com/todoroo/astrid/reminders/ReminderService.java index 6a2d851f4..0d4d20a0b 100644 --- a/src/main/java/com/todoroo/astrid/reminders/ReminderService.java +++ b/src/main/java/com/todoroo/astrid/reminders/ReminderService.java @@ -97,7 +97,11 @@ public final class ReminderService { } public List getPastReminders() { - return jobs.removeOverdueJobs(); + return jobs.getOverdueJobs(); + } + + public boolean remove(Reminder reminder) { + return jobs.remove(reminder); } public void scheduleNextJob() { diff --git a/src/main/java/org/tasks/jobs/AlarmJob.java b/src/main/java/org/tasks/jobs/AlarmJob.java index 5abb47b35..f8b858a2e 100644 --- a/src/main/java/org/tasks/jobs/AlarmJob.java +++ b/src/main/java/org/tasks/jobs/AlarmJob.java @@ -29,11 +29,12 @@ public class AlarmJob extends WakefulJob { @Override protected void run() { if (!preferences.isCurrentlyQuietHours()) { - for (Alarm alarm : alarmService.removePastDueAlarms()) { + for (Alarm alarm : alarmService.getOverdueAlarms()) { Task task = taskDao.fetch(alarm.getTaskId(), Task.REMINDER_LAST); if (task != null && task.getReminderLast() < alarm.getTime()) { notifier.triggerTaskNotification(alarm.getTaskId(), ReminderService.TYPE_ALARM); } + alarmService.remove(alarm); } } } diff --git a/src/main/java/org/tasks/jobs/Job.java b/src/main/java/org/tasks/jobs/Job.java index ccfba5dbc..5845fee22 100644 --- a/src/main/java/org/tasks/jobs/Job.java +++ b/src/main/java/org/tasks/jobs/Job.java @@ -15,6 +15,7 @@ public abstract class Job extends InjectingIntentService { public Job(String name) { super(name); + setIntentRedelivery(true); } @Override diff --git a/src/main/java/org/tasks/jobs/JobQueue.java b/src/main/java/org/tasks/jobs/JobQueue.java index c6f548533..a1679a160 100644 --- a/src/main/java/org/tasks/jobs/JobQueue.java +++ b/src/main/java/org/tasks/jobs/JobQueue.java @@ -62,15 +62,18 @@ public class JobQueue { } } - public synchronized List removeOverdueJobs() { + public synchronized List getOverdueJobs() { List result = newArrayList(); - SortedSet lapsed = jobs.keySet().headSet(currentTimeMillis() + 1); - for (Long key : ImmutableSortedSet.copyOf(lapsed)) { - result.addAll(jobs.removeAll(key)); + for (Long key : jobs.keySet().headSet(currentTimeMillis() + 1)) { + result.addAll(jobs.get(key)); } return result; } + public synchronized boolean remove(T entry) { + return jobs.remove(entry.getTime(), entry); + } + public synchronized void scheduleNext() { scheduleNext(false); } diff --git a/src/main/java/org/tasks/jobs/ReminderJob.java b/src/main/java/org/tasks/jobs/ReminderJob.java index f40b9234d..43767a79e 100644 --- a/src/main/java/org/tasks/jobs/ReminderJob.java +++ b/src/main/java/org/tasks/jobs/ReminderJob.java @@ -32,6 +32,7 @@ public class ReminderJob extends WakefulJob { if (!preferences.isCurrentlyQuietHours()) { for (Reminder reminder : reminderService.getPastReminders()) { notifier.triggerTaskNotification(reminder.getId(), reminder.getType()); + reminderService.remove(reminder); } } }