Clean up alarm scheduling

pull/645/merge
Alex Baker 6 years ago
parent 31a93b4fef
commit 03188b90c2

@ -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<Long> alarms) {
List<Alarm> metadata = new ArrayList<>();
for(Long alarm : alarms) {
Alarm item = new Alarm();
item.setTime(alarm);
metadata.add(item);
public boolean synchronizeAlarms(final long taskId, Set<Long> 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<Alarm> 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;
}
}

@ -16,10 +16,10 @@ public interface LocationDao {
@Query("SELECT * FROM locations WHERE task = :taskId ORDER BY name ASC")
List<Location> 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<Location> 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<Location> getActiveGeofences();
@Delete

@ -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;

@ -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;

Loading…
Cancel
Save