From 248588b3558409ff02ec56a981af3bb634d3e4bf Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Mon, 21 Aug 2017 17:16:27 -0500 Subject: [PATCH] Combine alarms and jobs into one queue --- .../astrid/reminders/ReminderServiceTest.java | 36 +++++----- .../java/org/tasks/jobs/JobQueueTest.java | 67 +++++++++++++++++-- app/src/main/AndroidManifest.xml | 10 +-- .../todoroo/astrid/alarms/AlarmService.java | 29 ++------ .../astrid/reminders/ReminderService.java | 29 ++------ .../injection/IntentServiceComponent.java | 7 +- app/src/main/java/org/tasks/jobs/Alarm.java | 9 ++- .../main/java/org/tasks/jobs/JobManager.java | 9 +-- .../main/java/org/tasks/jobs/JobQueue.java | 58 ++++++++-------- .../{AlarmJob.java => NotificationJob.java} | 27 +++++--- .../main/java/org/tasks/jobs/ReminderJob.java | 50 -------------- .../NotificationSchedulerIntentService.java | 5 +- 12 files changed, 152 insertions(+), 184 deletions(-) rename app/src/main/java/org/tasks/jobs/{AlarmJob.java => NotificationJob.java} (51%) delete mode 100644 app/src/main/java/org/tasks/jobs/ReminderJob.java diff --git a/app/src/androidTest/java/com/todoroo/astrid/reminders/ReminderServiceTest.java b/app/src/androidTest/java/com/todoroo/astrid/reminders/ReminderServiceTest.java index dc1887410..ca97da550 100644 --- a/app/src/androidTest/java/com/todoroo/astrid/reminders/ReminderServiceTest.java +++ b/app/src/androidTest/java/com/todoroo/astrid/reminders/ReminderServiceTest.java @@ -54,7 +54,7 @@ public class ReminderServiceTest extends InjectingTestCase { private ReminderService service; private Random random; - private JobQueue jobs; + private JobQueue jobs; @Before public void before() { @@ -78,14 +78,14 @@ public class ReminderServiceTest extends InjectingTestCase { public void dontScheduleDueDateReminderWhenFlagNotSet() { service.scheduleAlarm(null, newTask(with(ID, 1L), with(DUE_TIME, newDateTime()))); - verify(jobs).cancel(1); + verify(jobs).cancelReminder(1); } @Test public void dontScheduleDueDateReminderWhenTimeNotSet() { service.scheduleAlarm(null, newTask(with(ID, 1L), with(REMINDERS, NOTIFY_AT_DEADLINE))); - verify(jobs).cancel(1); + verify(jobs).cancelReminder(1); } @Test @@ -97,7 +97,7 @@ public class ReminderServiceTest extends InjectingTestCase { service.scheduleAlarm(null, task); InOrder order = inOrder(jobs); - order.verify(jobs).cancel(1); + order.verify(jobs).cancelReminder(1); order.verify(jobs).add(new Reminder(1, task.getDueDate(), ReminderService.TYPE_DUE)); } @@ -110,7 +110,7 @@ public class ReminderServiceTest extends InjectingTestCase { service.scheduleAlarm(null, task); InOrder order = inOrder(jobs); - order.verify(jobs).cancel(1); + order.verify(jobs).cancelReminder(1); order.verify(jobs).add(new Reminder(1, task.getDueDate(), ReminderService.TYPE_DUE)); } @@ -124,7 +124,7 @@ public class ReminderServiceTest extends InjectingTestCase { service.scheduleAlarm(null, task); InOrder order = inOrder(jobs); - order.verify(jobs).cancel(1); + order.verify(jobs).cancelReminder(1); order.verify(jobs).add(new Reminder(1, now.startOfDay().withHourOfDay(18).getMillis(), ReminderService.TYPE_DUE)); } @@ -138,7 +138,7 @@ public class ReminderServiceTest extends InjectingTestCase { service.scheduleAlarm(null, task); - verify(jobs).cancel(1); + verify(jobs).cancelReminder(1); } @Test @@ -151,7 +151,7 @@ public class ReminderServiceTest extends InjectingTestCase { service.scheduleAlarm(null, task); - verify(jobs).cancel(1); + verify(jobs).cancelReminder(1); } @Test @@ -165,7 +165,7 @@ public class ReminderServiceTest extends InjectingTestCase { service.scheduleAlarm(null, task); - verify(jobs).cancel(1); + verify(jobs).cancelReminder(1); } @Test @@ -178,7 +178,7 @@ public class ReminderServiceTest extends InjectingTestCase { service.scheduleAlarm(null, task); InOrder order = inOrder(jobs); - order.verify(jobs).cancel(1); + order.verify(jobs).cancelReminder(1); order.verify(jobs).add(new Reminder(1, task.getDueDate(), ReminderService.TYPE_DUE)); } @@ -197,7 +197,7 @@ public class ReminderServiceTest extends InjectingTestCase { service.scheduleAlarm(null, task); InOrder order = inOrder(jobs); - order.verify(jobs).cancel(1); + order.verify(jobs).cancelReminder(1); order.verify(jobs).add(new Reminder(1L, now.minusDays(1).getMillis() + 584206592, ReminderService.TYPE_RANDOM)); }}); } @@ -216,7 +216,7 @@ public class ReminderServiceTest extends InjectingTestCase { service.scheduleAlarm(null, task); InOrder order = inOrder(jobs); - order.verify(jobs).cancel(1); + order.verify(jobs).cancelReminder(1); order.verify(jobs).add(new Reminder(1L, now.minusDays(1).getMillis() + 584206592, ReminderService.TYPE_RANDOM)); }}); } @@ -235,7 +235,7 @@ public class ReminderServiceTest extends InjectingTestCase { service.scheduleAlarm(null, task); InOrder order = inOrder(jobs); - order.verify(jobs).cancel(1); + order.verify(jobs).cancelReminder(1); order.verify(jobs).add(new Reminder(1L, now.getMillis() + 10148400, ReminderService.TYPE_RANDOM)); }}); } @@ -252,7 +252,7 @@ public class ReminderServiceTest extends InjectingTestCase { service.scheduleAlarm(null, task); InOrder order = inOrder(jobs); - order.verify(jobs).cancel(1); + order.verify(jobs).cancelReminder(1); order.verify(jobs).add(new Reminder(1L, task.getDueDate() + 4582800, ReminderService.TYPE_OVERDUE)); }}); } @@ -269,7 +269,7 @@ public class ReminderServiceTest extends InjectingTestCase { service.scheduleAlarm(null, task); InOrder order = inOrder(jobs); - order.verify(jobs).cancel(1); + order.verify(jobs).cancelReminder(1); order.verify(jobs).add(new Reminder(1L, currentTimeMillis(), ReminderService.TYPE_OVERDUE)); }}); } @@ -286,7 +286,7 @@ public class ReminderServiceTest extends InjectingTestCase { service.scheduleAlarm(null, task); InOrder order = inOrder(jobs); - order.verify(jobs).cancel(1); + order.verify(jobs).cancelReminder(1); order.verify(jobs).add(new Reminder(1L, currentTimeMillis(), ReminderService.TYPE_OVERDUE)); }}); } @@ -305,7 +305,7 @@ public class ReminderServiceTest extends InjectingTestCase { service.scheduleAlarm(null, task); InOrder order = inOrder(jobs); - order.verify(jobs).cancel(1); + order.verify(jobs).cancelReminder(1); order.verify(jobs).add(new Reminder(1L, currentTimeMillis() + 22748400, ReminderService.TYPE_OVERDUE)); }}); } @@ -323,7 +323,7 @@ public class ReminderServiceTest extends InjectingTestCase { service.scheduleAlarm(null, task); InOrder order = inOrder(jobs); - order.verify(jobs).cancel(1); + order.verify(jobs).cancelReminder(1); order.verify(jobs).add(new Reminder(1, now.plusMonths(12).getMillis(), ReminderService.TYPE_SNOOZE)); } diff --git a/app/src/androidTest/java/org/tasks/jobs/JobQueueTest.java b/app/src/androidTest/java/org/tasks/jobs/JobQueueTest.java index 9ee549b01..e72febf0c 100644 --- a/app/src/androidTest/java/org/tasks/jobs/JobQueueTest.java +++ b/app/src/androidTest/java/org/tasks/jobs/JobQueueTest.java @@ -30,9 +30,9 @@ import static org.tasks.time.DateTimeUtils.currentTimeMillis; public class JobQueueTest { private static final long ONE_MINUTE = TimeUnit.MINUTES.toMillis(1); - private static final String TAG = "test"; + private static final String TAG = NotificationJob.TAG; - private JobQueue queue; + private JobQueue queue; private JobManager jobManager; private Preferences preferences; @@ -41,7 +41,7 @@ public class JobQueueTest { preferences = mock(Preferences.class); when(preferences.adjustForQuietHours(anyLong())).then(returnsFirstArg()); jobManager = mock(JobManager.class); - queue = new JobQueue<>(preferences, jobManager, TAG); + queue = new JobQueue(preferences, jobManager); } @After @@ -49,6 +49,59 @@ public class JobQueueTest { verifyNoMoreInteractions(jobManager); } + @Test + public void alarmAndReminderSameTimeSameID() { + long now = currentTimeMillis(); + + queue.add(new Reminder(1, now, TYPE_DUE)); + queue.add(new Alarm(1, 1, now)); + + verify(jobManager).schedule(TAG, now); + + Freeze.freezeAt(now).thawAfter(new Snippet() {{ + assertEquals( + asList(new Reminder(1, now, TYPE_DUE), + new Alarm(1, 1, now)), + queue.getOverdueJobs()); + }}); + } + + @Test + public void removeAlarmLeaveReminder() { + long now = currentTimeMillis(); + + queue.add(new Reminder(1, now, TYPE_DUE)); + queue.add(new Alarm(1, 1, now)); + + verify(jobManager).schedule(TAG, now); + + queue.remove(new Alarm(1, 1, now)); + + Freeze.freezeAt(now).thawAfter(new Snippet() {{ + assertEquals( + singletonList(new Reminder(1, now, TYPE_DUE)), + queue.getOverdueJobs()); + }}); + } + + @Test + public void removeReminderLeaveAlarm() { + long now = currentTimeMillis(); + + queue.add(new Reminder(1, now, TYPE_DUE)); + queue.add(new Alarm(1, 1, now)); + + verify(jobManager).schedule(TAG, now); + + queue.remove(new Reminder(1, now, TYPE_DUE)); + + Freeze.freezeAt(now).thawAfter(new Snippet() {{ + assertEquals( + singletonList(new Alarm(1, 1, now)), + queue.getOverdueJobs()); + }}); + } + @Test public void twoJobsAtSameTime() { queue.add(new Reminder(1, 1, 0)); @@ -87,7 +140,7 @@ public class JobQueueTest { @Test public void rescheduleWhenCancelingOnlyJob() { queue.add(new Reminder(1, 2, 0)); - queue.cancel(1); + queue.cancelReminder(1); InOrder order = inOrder(jobManager); order.verify(jobManager).schedule(TAG, 2); @@ -99,7 +152,7 @@ public class JobQueueTest { queue.add(new Reminder(1, 1, 0)); queue.add(new Reminder(2, 2, 0)); - queue.cancel(1); + queue.cancelReminder(1); InOrder order = inOrder(jobManager); order.verify(jobManager).schedule(TAG, 1); @@ -111,7 +164,7 @@ public class JobQueueTest { queue.add(new Reminder(1, 1, 0)); queue.add(new Reminder(2, 2, 0)); - queue.cancel(2); + queue.cancelReminder(2); verify(jobManager).schedule(TAG, 1); } @@ -234,7 +287,7 @@ public class JobQueueTest { long now = currentTimeMillis(); queue.add(new Reminder(1, now, TYPE_DUE)); - queue.cancel(2); + queue.cancelReminder(2); verify(jobManager).schedule(TAG, now); } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 464dc7342..3e6553f3a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -456,15 +456,9 @@ android:permission="android.permission.BIND_JOB_SERVICE" android:exported="false" /> - + - - - diff --git a/app/src/main/java/com/todoroo/astrid/alarms/AlarmService.java b/app/src/main/java/com/todoroo/astrid/alarms/AlarmService.java index 8ea0e7407..54d730372 100644 --- a/app/src/main/java/com/todoroo/astrid/alarms/AlarmService.java +++ b/app/src/main/java/com/todoroo/astrid/alarms/AlarmService.java @@ -22,9 +22,8 @@ import com.todoroo.astrid.service.SynchronizeMetadataCallback; import org.tasks.injection.ApplicationScope; import org.tasks.jobs.Alarm; -import org.tasks.jobs.JobManager; import org.tasks.jobs.JobQueue; -import org.tasks.preferences.Preferences; +import org.tasks.jobs.JobQueueEntry; import java.util.ArrayList; import java.util.HashSet; @@ -45,14 +44,14 @@ public class AlarmService { private static final long NO_ALARM = Long.MAX_VALUE; - private final JobQueue jobs; + private final JobQueue jobs; private final MetadataDao metadataDao; @Inject - public AlarmService(MetadataDao metadataDao, JobManager jobManager, Preferences preferences) { + public AlarmService(MetadataDao metadataDao, JobQueue jobQueue) { this.metadataDao = metadataDao; - jobs = JobQueue.newAlarmQueue(preferences, jobManager); + jobs = jobQueue; } public void getAlarms(long taskId, Callback callback) { @@ -75,7 +74,7 @@ public class AlarmService { metadata.add(item); } - boolean changed = synchronizeMetadata(taskId, metadata, m -> jobs.cancel(m.getId())); + boolean changed = synchronizeMetadata(taskId, metadata, m -> jobs.cancelAlarm(m.getId())); if(changed) { scheduleAlarms(taskId); @@ -99,10 +98,6 @@ public class AlarmService { MetadataCriteria.byTaskAndwithKey(taskId, AlarmFields.METADATA_KEY)))); } - public void clear() { - jobs.clear(); - } - /** * Schedules all alarms */ @@ -128,7 +123,7 @@ public class AlarmService { Alarm alarm = new Alarm(metadata); long time = alarm.getTime(); if(time == 0 || time == NO_ALARM) { - jobs.cancel(alarm.getId()); + jobs.cancelAlarm(alarm.getId()); } else { jobs.add(alarm); } @@ -184,16 +179,4 @@ public class AlarmService { return dirty[0]; } - - public void scheduleNextJob() { - jobs.scheduleNext(); - } - - public List getOverdueAlarms() { - return jobs.getOverdueJobs(); - } - - public boolean remove(Alarm alarm) { - return jobs.remove(alarm); - } } diff --git a/app/src/main/java/com/todoroo/astrid/reminders/ReminderService.java b/app/src/main/java/com/todoroo/astrid/reminders/ReminderService.java index 0d4d20a0b..b25654c79 100644 --- a/app/src/main/java/com/todoroo/astrid/reminders/ReminderService.java +++ b/app/src/main/java/com/todoroo/astrid/reminders/ReminderService.java @@ -15,15 +15,12 @@ import com.todoroo.astrid.data.Task; import org.tasks.R; import org.tasks.injection.ApplicationScope; -import org.tasks.jobs.JobManager; import org.tasks.jobs.JobQueue; import org.tasks.jobs.Reminder; import org.tasks.preferences.Preferences; import org.tasks.reminders.Random; import org.tasks.time.DateTime; -import java.util.List; - import javax.inject.Inject; import static org.tasks.date.DateTimeUtils.newDateTime; @@ -59,18 +56,18 @@ public final class ReminderService { private static final long NO_ALARM = Long.MAX_VALUE; - private final JobQueue jobs; + private final JobQueue jobs; private final Random random; private final Preferences preferences; private long now = -1; // For tracking when reminders might be scheduled all at once @Inject - ReminderService(Preferences preferences, JobManager jobManager) { - this(preferences, JobQueue.newReminderQueue(preferences, jobManager), new Random()); + ReminderService(Preferences preferences, JobQueue jobQueue) { + this(preferences, jobQueue, new Random()); } - ReminderService(Preferences preferences, JobQueue jobs, Random random) { + ReminderService(Preferences preferences, JobQueue jobs, Random random) { this.preferences = preferences; this.jobs = jobs; this.random = random; @@ -87,27 +84,11 @@ public final class ReminderService { now = -1; // Signal done with now variable } - public void clear() { - jobs.clear(); - } - private long getNowValue() { // If we're in the midst of mass scheduling, use the prestored now var return (now == -1 ? DateUtilities.now() : now); } - public List getPastReminders() { - return jobs.getOverdueJobs(); - } - - public boolean remove(Reminder reminder) { - return jobs.remove(reminder); - } - - public void scheduleNextJob() { - jobs.scheduleNext(); - } - public void scheduleAlarm(TaskDao taskDao, Task task) { if(task == null || !task.isSaved()) { return; @@ -129,7 +110,7 @@ public final class ReminderService { // Make sure no alarms are scheduled other than the next one. When that one is shown, it // will schedule the next one after it, and so on and so forth. - jobs.cancel(taskId); + jobs.cancelReminder(taskId); if(task.isCompleted() || task.isDeleted()) { return; diff --git a/app/src/main/java/org/tasks/injection/IntentServiceComponent.java b/app/src/main/java/org/tasks/injection/IntentServiceComponent.java index 5cad8c782..ba60ade50 100644 --- a/app/src/main/java/org/tasks/injection/IntentServiceComponent.java +++ b/app/src/main/java/org/tasks/injection/IntentServiceComponent.java @@ -1,10 +1,9 @@ package org.tasks.injection; -import org.tasks.jobs.AlarmJob; +import org.tasks.jobs.NotificationJob; import org.tasks.jobs.BackupJob; import org.tasks.jobs.MidnightRefreshJob; import org.tasks.jobs.RefreshJob; -import org.tasks.jobs.ReminderJob; import org.tasks.location.GeofenceTransitionsIntentService; import org.tasks.scheduling.CalendarNotificationIntentService; import org.tasks.scheduling.GeofenceSchedulingIntentService; @@ -25,13 +24,11 @@ public interface IntentServiceComponent { void inject(NotificationSchedulerIntentService notificationSchedulerIntentService); - void inject(AlarmJob alarmJob); + void inject(NotificationJob notificationJob); void inject(BackupJob backupJob); void inject(MidnightRefreshJob midnightRefreshJob); void inject(RefreshJob refreshJob); - - void inject(ReminderJob reminderJob); } diff --git a/app/src/main/java/org/tasks/jobs/Alarm.java b/app/src/main/java/org/tasks/jobs/Alarm.java index ffb9074b6..c48139bb6 100644 --- a/app/src/main/java/org/tasks/jobs/Alarm.java +++ b/app/src/main/java/org/tasks/jobs/Alarm.java @@ -39,12 +39,17 @@ public class Alarm implements JobQueueEntry { Alarm alarm = (Alarm) o; - return alarmId == alarm.alarmId; + if (alarmId != alarm.alarmId) return false; + if (taskId != alarm.taskId) return false; + return time == alarm.time; } @Override public int hashCode() { - return (int) (alarmId ^ (alarmId >>> 32)); + int result = (int) (alarmId ^ (alarmId >>> 32)); + result = 31 * result + (int) (taskId ^ (taskId >>> 32)); + result = 31 * result + (int) (time ^ (time >>> 32)); + return result; } @Override diff --git a/app/src/main/java/org/tasks/jobs/JobManager.java b/app/src/main/java/org/tasks/jobs/JobManager.java index 8cd6df71f..e4914c12b 100644 --- a/app/src/main/java/org/tasks/jobs/JobManager.java +++ b/app/src/main/java/org/tasks/jobs/JobManager.java @@ -20,8 +20,7 @@ import static org.tasks.time.DateTimeUtils.printTimestamp; public class JobManager { static final int JOB_ID_REFRESH = 1; - static final int JOB_ID_REMINDER = 2; - static final int JOB_ID_ALARM = 3; + static final int JOB_ID_NOTIFICATION = 3; public static final int JOB_ID_GEOFENCE_TRANSITION = 4; public static final int JOB_ID_GEOFENCE_SCHEDULING = 5; static final int JOB_ID_MIDNIGHT_REFRESH = 6; @@ -72,10 +71,8 @@ public class JobManager { private PendingIntent getPendingIntent(String tag) { switch (tag) { - case ReminderJob.TAG: - return getPendingBroadcast(ReminderJob.Broadcast.class); - case AlarmJob.TAG: - return getPendingBroadcast(AlarmJob.Broadcast.class); + case NotificationJob.TAG: + return getPendingBroadcast(NotificationJob.Broadcast.class); case RefreshJob.TAG: return getPendingBroadcast(RefreshJob.Broadcast.class); default: diff --git a/app/src/main/java/org/tasks/jobs/JobQueue.java b/app/src/main/java/org/tasks/jobs/JobQueue.java index a1679a160..f3ca4e645 100644 --- a/app/src/main/java/org/tasks/jobs/JobQueue.java +++ b/app/src/main/java/org/tasks/jobs/JobQueue.java @@ -1,42 +1,35 @@ 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.Ints; import com.google.common.primitives.Longs; +import org.tasks.injection.ApplicationScope; import org.tasks.preferences.Preferences; import java.util.List; -import java.util.NavigableSet; -import java.util.SortedSet; + +import javax.inject.Inject; import static com.google.common.collect.Iterables.filter; import static com.google.common.collect.Lists.newArrayList; import static org.tasks.time.DateTimeUtils.currentTimeMillis; -public class JobQueue { - private final TreeMultimap jobs = TreeMultimap.create(Ordering.natural(), (l, r) -> Longs.compare(l.getId(), r.getId())); +@ApplicationScope +public class JobQueue { + private final TreeMultimap jobs = TreeMultimap.create(Ordering.natural(), (l, r) -> Ints.compare(l.hashCode(), r.hashCode())); private final Preferences preferences; private final JobManager jobManager; - private final String tag; - - public static JobQueue newReminderQueue(Preferences preferences, JobManager jobManager) { - return new JobQueue<>(preferences, jobManager, ReminderJob.TAG); - } - - public static JobQueue newAlarmQueue(Preferences preferences, JobManager jobManager) { - return new JobQueue<>(preferences, jobManager, AlarmJob.TAG); - } - JobQueue(Preferences preferences, JobManager jobManager, String tag) { + @Inject + public JobQueue(Preferences preferences, JobManager jobManager) { this.preferences = preferences; this.jobManager = jobManager; - this.tag = tag; } - public synchronized void add(T entry) { + public synchronized void add(T entry) { boolean reschedule = jobs.isEmpty() || entry.getTime() < firstTime(); jobs.put(entry.getTime(), entry); if (reschedule) { @@ -46,14 +39,23 @@ public class JobQueue { public synchronized void clear() { jobs.clear(); - jobManager.cancel(tag); + jobManager.cancel(NotificationJob.TAG); + } + + public synchronized void cancelAlarm(long alarmId) { + cancel(Alarm.class, alarmId); + } + + public synchronized void cancelReminder(long taskId) { + cancel(Reminder.class, taskId); } - public synchronized void cancel(long id) { + private synchronized void cancel(Class c, long id) { boolean reschedule = false; long firstTime = firstTime(); - List existing = newArrayList(filter(jobs.values(), r -> r.getId() == id)); - for (T entry : existing) { + List existing = newArrayList( + filter(jobs.values(), r -> r.getClass().equals(c) && r.getId() == id)); + for (JobQueueEntry entry : existing) { reschedule |= entry.getTime() == firstTime; jobs.remove(entry.getTime(), entry); } @@ -62,29 +64,29 @@ public class JobQueue { } } - public synchronized List getOverdueJobs() { - List result = newArrayList(); + synchronized List getOverdueJobs() { + List result = newArrayList(); for (Long key : jobs.keySet().headSet(currentTimeMillis() + 1)) { result.addAll(jobs.get(key)); } return result; } - public synchronized boolean remove(T entry) { + public synchronized boolean remove(JobQueueEntry entry) { return jobs.remove(entry.getTime(), entry); } - public synchronized void scheduleNext() { + synchronized void scheduleNext() { scheduleNext(false); } private void scheduleNext(boolean cancelCurrent) { if (jobs.isEmpty()) { if (cancelCurrent) { - jobManager.cancel(tag); + jobManager.cancel(NotificationJob.TAG); } } else { - jobManager.schedule(tag, nextScheduledTime()); + jobManager.schedule(NotificationJob.TAG, nextScheduledTime()); } } @@ -101,7 +103,7 @@ public class JobQueue { return jobs.size(); } - List getJobs() { + List getJobs() { return ImmutableList.copyOf(jobs.values()); } } diff --git a/app/src/main/java/org/tasks/jobs/AlarmJob.java b/app/src/main/java/org/tasks/jobs/NotificationJob.java similarity index 51% rename from app/src/main/java/org/tasks/jobs/AlarmJob.java rename to app/src/main/java/org/tasks/jobs/NotificationJob.java index 9097e51a0..c8b311328 100644 --- a/app/src/main/java/org/tasks/jobs/AlarmJob.java +++ b/app/src/main/java/org/tasks/jobs/NotificationJob.java @@ -5,7 +5,6 @@ import android.content.Context; import android.content.Intent; import android.support.v4.app.JobIntentService; -import com.todoroo.astrid.alarms.AlarmService; import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.data.Task; import com.todoroo.astrid.reminders.ReminderService; @@ -16,38 +15,44 @@ import org.tasks.preferences.Preferences; import javax.inject.Inject; -public class AlarmJob extends Job { +public class NotificationJob extends Job { public static class Broadcast extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { - JobIntentService.enqueueWork(context, AlarmJob.class, JobManager.JOB_ID_ALARM, intent); + JobIntentService.enqueueWork(context, NotificationJob.class, JobManager.JOB_ID_NOTIFICATION, intent); } } - public static final String TAG = "job_alarm"; + public static final String TAG = "job_notification"; @Inject Preferences preferences; - @Inject AlarmService alarmService; @Inject Notifier notifier; @Inject TaskDao taskDao; + @Inject JobQueue jobQueue; @Override protected void run() { if (!preferences.isCurrentlyQuietHours()) { - 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); + for (JobQueueEntry entry : jobQueue.getOverdueJobs()) { + if (entry instanceof Alarm) { + Alarm alarm = (Alarm) entry; + Task task = taskDao.fetch(alarm.getTaskId(), Task.REMINDER_LAST); + if (task != null && task.getReminderLast() < alarm.getTime()) { + notifier.triggerTaskNotification(alarm.getTaskId(), ReminderService.TYPE_ALARM); + } + } else if (entry instanceof Reminder) { + Reminder reminder = (Reminder) entry; + notifier.triggerTaskNotification(reminder.getId(), reminder.getType()); } - alarmService.remove(alarm); + jobQueue.remove(entry); } } } @Override protected void scheduleNext() { - alarmService.scheduleNextJob(); + jobQueue.scheduleNext(); } @Override diff --git a/app/src/main/java/org/tasks/jobs/ReminderJob.java b/app/src/main/java/org/tasks/jobs/ReminderJob.java deleted file mode 100644 index c988a88ac..000000000 --- a/app/src/main/java/org/tasks/jobs/ReminderJob.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.tasks.jobs; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.support.v4.app.JobIntentService; - -import com.todoroo.astrid.reminders.ReminderService; - -import org.tasks.Notifier; -import org.tasks.injection.IntentServiceComponent; -import org.tasks.preferences.Preferences; - -import javax.inject.Inject; - -public class ReminderJob extends Job { - - public static class Broadcast extends BroadcastReceiver { - @Override - public void onReceive(Context context, Intent intent) { - JobIntentService.enqueueWork(context, ReminderJob.class, JobManager.JOB_ID_REMINDER, intent); - } - } - - public static final String TAG = "job_reminder"; - - @Inject Preferences preferences; - @Inject ReminderService reminderService; - @Inject Notifier notifier; - - @Override - protected void inject(IntentServiceComponent component) { - component.inject(this); - } - - @Override - protected void run() { - if (!preferences.isCurrentlyQuietHours()) { - for (Reminder reminder : reminderService.getPastReminders()) { - notifier.triggerTaskNotification(reminder.getId(), reminder.getType()); - reminderService.remove(reminder); - } - } - } - - @Override - protected void scheduleNext() { - reminderService.scheduleNextJob(); - } -} diff --git a/app/src/main/java/org/tasks/scheduling/NotificationSchedulerIntentService.java b/app/src/main/java/org/tasks/scheduling/NotificationSchedulerIntentService.java index 097cc1600..631c83428 100644 --- a/app/src/main/java/org/tasks/scheduling/NotificationSchedulerIntentService.java +++ b/app/src/main/java/org/tasks/scheduling/NotificationSchedulerIntentService.java @@ -8,6 +8,7 @@ import com.todoroo.astrid.reminders.ReminderService; import org.tasks.injection.InjectingJobIntentService; import org.tasks.injection.IntentServiceComponent; +import org.tasks.jobs.JobQueue; import javax.inject.Inject; @@ -18,6 +19,7 @@ public class NotificationSchedulerIntentService extends InjectingJobIntentServic @Inject AlarmService alarmService; @Inject ReminderService reminderService; @Inject TaskDao taskDao; + @Inject JobQueue jobQueue; @Override protected void onHandleWork(Intent intent) { @@ -25,8 +27,7 @@ public class NotificationSchedulerIntentService extends InjectingJobIntentServic Timber.d("onHandleIntent(%s)", intent); - reminderService.clear(); - alarmService.clear(); + jobQueue.clear(); reminderService.scheduleAllAlarms(taskDao); alarmService.scheduleAllAlarms();