diff --git a/src/androidTest/java/org/tasks/jobs/JobQueueTest.java b/src/androidTest/java/org/tasks/jobs/JobQueueTest.java index dba4dcbf9..29b8ee066 100644 --- a/src/androidTest/java/org/tasks/jobs/JobQueueTest.java +++ b/src/androidTest/java/org/tasks/jobs/JobQueueTest.java @@ -164,6 +164,25 @@ public class JobQueueTest { queue.getJobs()); } + @Test + public void multipleOverduePeriodsLapsed() { + long now = currentTimeMillis(); + + queue.add(new Reminder(1, now, TYPE_DUE)); + queue.add(new Reminder(2, now + ONE_MINUTE, TYPE_DUE)); + queue.add(new Reminder(3, now + 2 * ONE_MINUTE, TYPE_DUE)); + + verify(jobManager).schedule(TAG, now); + + Freeze.freezeAt(now + ONE_MINUTE).thawAfter(new Snippet() {{ + queue.removeOverdueJobs(); + }}); + + assertEquals( + singletonList(new Reminder(3, now + 2 * ONE_MINUTE, TYPE_DUE)), + queue.getJobs()); + } + @Test public void clearShouldCancelExisting() { queue.add(new Reminder(1, 1, 0)); diff --git a/src/main/java/org/tasks/jobs/JobQueue.java b/src/main/java/org/tasks/jobs/JobQueue.java index fc8366acb..c6f548533 100644 --- a/src/main/java/org/tasks/jobs/JobQueue.java +++ b/src/main/java/org/tasks/jobs/JobQueue.java @@ -1,6 +1,7 @@ package org.tasks.jobs; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSortedSet; import com.google.common.collect.Ordering; import com.google.common.collect.TreeMultimap; import com.google.common.primitives.Longs; @@ -8,6 +9,7 @@ import com.google.common.primitives.Longs; import org.tasks.preferences.Preferences; import java.util.List; +import java.util.NavigableSet; import java.util.SortedSet; import static com.google.common.collect.Iterables.filter; @@ -63,7 +65,7 @@ public class JobQueue { public synchronized List removeOverdueJobs() { List result = newArrayList(); SortedSet lapsed = jobs.keySet().headSet(currentTimeMillis() + 1); - for (Long key : lapsed) { + for (Long key : ImmutableSortedSet.copyOf(lapsed)) { result.addAll(jobs.removeAll(key)); } return result;