From 03188b90c255ce8d9421e32250e8339eb6618b5f Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Tue, 20 Mar 2018 13:58:41 -0500 Subject: [PATCH] Clean up alarm scheduling --- .../todoroo/astrid/alarms/AlarmService.java | 60 +++++-------------- .../main/java/org/tasks/data/LocationDao.java | 4 +- .../org/tasks/location/GeofenceService.java | 1 - .../NotificationSchedulerIntentService.java | 2 - 4 files changed, 16 insertions(+), 51 deletions(-) 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 e29b05048..0d586d086 100644 --- a/app/src/main/java/com/todoroo/astrid/alarms/AlarmService.java +++ b/app/src/main/java/com/todoroo/astrid/alarms/AlarmService.java @@ -11,7 +11,6 @@ import org.tasks.injection.ApplicationScope; import org.tasks.jobs.AlarmJob; import org.tasks.jobs.JobQueue; -import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; @@ -60,15 +59,22 @@ public class AlarmService { * Save the given array of alarms into the database * @return true if data was changed */ - public boolean synchronizeAlarms(final long taskId, Set alarms) { - List metadata = new ArrayList<>(); - for(Long alarm : alarms) { - Alarm item = new Alarm(); - item.setTime(alarm); - metadata.add(item); + public boolean synchronizeAlarms(final long taskId, Set timestamps) { + boolean changed = false; + + for (Alarm item : alarmDao.getAlarms(taskId)) { + if (!timestamps.contains(item.getTime())) { + jobs.cancelAlarm(item.getId()); + alarmDao.delete(item); + changed = true; + } } - boolean changed = synchronizeMetadata(taskId, metadata, m -> jobs.cancelAlarm(m.getId())); + // everything that remains shall be written + for(Long timestamp : timestamps) { + alarmDao.insert(new Alarm(taskId, timestamp)); + changed = true; + } if(changed) { scheduleAlarms(taskId); @@ -120,42 +126,4 @@ public class AlarmService { jobs.add(alarmJob); } } - - public interface SynchronizeAlarmCallback { - void beforeDelete(Alarm alarm); - } - - private boolean synchronizeMetadata(long taskId, List alarms, final SynchronizeAlarmCallback callback) { - boolean dirty = false; - for(Alarm metadatum : alarms) { - metadatum.setTask(taskId); - metadatum.setId(0L); - } - - for (Alarm item : alarmDao.getAlarms(taskId)) { - long id = item.getId(); - - // clear item id when matching with incoming values - item.setId(0L); - if(alarms.contains(item)) { - alarms.remove(item); - } else { - // not matched. cut it - item.setId(id); - if (callback != null) { - callback.beforeDelete(item); - } - alarmDao.delete(item); - dirty = true; - } - } - - // everything that remains shall be written - for(Alarm alarm : alarms) { - alarmDao.insert(alarm); - dirty = true; - } - - return dirty; - } } diff --git a/app/src/main/java/org/tasks/data/LocationDao.java b/app/src/main/java/org/tasks/data/LocationDao.java index 58b7bb7e2..853d55604 100644 --- a/app/src/main/java/org/tasks/data/LocationDao.java +++ b/app/src/main/java/org/tasks/data/LocationDao.java @@ -16,10 +16,10 @@ public interface LocationDao { @Query("SELECT * FROM locations WHERE task = :taskId ORDER BY name ASC") List getGeofences(long taskId); - @Query("SELECT locations.* FROM locations LEFT JOIN tasks ON tasks._id = locations.task WHERE locations.task = :taskId AND tasks.deleted = 0 AND tasks.completed = 0") + @Query("SELECT locations.* FROM locations INNER JOIN tasks ON tasks._id = locations.task WHERE tasks._id = :taskId AND tasks.deleted = 0 AND tasks.completed = 0") List getActiveGeofences(long taskId); - @Query("SELECT locations.* FROM locations LEFT JOIN tasks ON tasks._id = locations.task WHERE tasks.deleted = 0 AND tasks.completed = 0") + @Query("SELECT locations.* FROM locations INNER JOIN tasks ON tasks._id = locations.task WHERE tasks.deleted = 0 AND tasks.completed = 0") List getActiveGeofences(); @Delete diff --git a/app/src/main/java/org/tasks/location/GeofenceService.java b/app/src/main/java/org/tasks/location/GeofenceService.java index be2f80ec4..7ce75b378 100644 --- a/app/src/main/java/org/tasks/location/GeofenceService.java +++ b/app/src/main/java/org/tasks/location/GeofenceService.java @@ -2,7 +2,6 @@ package org.tasks.location; import org.tasks.data.Location; import org.tasks.data.LocationDao; - import java.util.List; import java.util.Set; diff --git a/app/src/main/java/org/tasks/scheduling/NotificationSchedulerIntentService.java b/app/src/main/java/org/tasks/scheduling/NotificationSchedulerIntentService.java index 6aea81443..3aacd4edd 100644 --- a/app/src/main/java/org/tasks/scheduling/NotificationSchedulerIntentService.java +++ b/app/src/main/java/org/tasks/scheduling/NotificationSchedulerIntentService.java @@ -5,7 +5,6 @@ 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.reminders.ReminderService; import org.tasks.injection.InjectingJobIntentService; @@ -30,7 +29,6 @@ public class NotificationSchedulerIntentService extends InjectingJobIntentServic @Inject AlarmService alarmService; @Inject ReminderService reminderService; - @Inject TaskDao taskDao; @Inject JobQueue jobQueue; @Inject NotificationManager notificationManager;