mirror of https://github.com/tasks/tasks
Replace android-job with intent services
parent
244ac6c9e6
commit
ac03c211e0
@ -1,47 +1,48 @@
|
|||||||
package org.tasks.jobs;
|
package org.tasks.jobs;
|
||||||
|
|
||||||
import android.support.annotation.NonNull;
|
|
||||||
|
|
||||||
import com.evernote.android.job.Job;
|
|
||||||
import com.todoroo.astrid.alarms.AlarmService;
|
import com.todoroo.astrid.alarms.AlarmService;
|
||||||
import com.todoroo.astrid.dao.TaskDao;
|
import com.todoroo.astrid.dao.TaskDao;
|
||||||
import com.todoroo.astrid.data.Task;
|
import com.todoroo.astrid.data.Task;
|
||||||
import com.todoroo.astrid.reminders.ReminderService;
|
import com.todoroo.astrid.reminders.ReminderService;
|
||||||
|
|
||||||
import org.tasks.Notifier;
|
import org.tasks.Notifier;
|
||||||
|
import org.tasks.injection.IntentServiceComponent;
|
||||||
import org.tasks.preferences.Preferences;
|
import org.tasks.preferences.Preferences;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
public class AlarmJob extends Job {
|
public class AlarmJob extends Job {
|
||||||
|
|
||||||
public static final String TAG = "job_alarm";
|
public static final String TAG = "job_alarm";
|
||||||
|
|
||||||
private final Preferences preferences;
|
@Inject Preferences preferences;
|
||||||
private final AlarmService alarmService;
|
@Inject AlarmService alarmService;
|
||||||
private final Notifier notifier;
|
@Inject Notifier notifier;
|
||||||
private final TaskDao taskDao;
|
@Inject TaskDao taskDao;
|
||||||
|
|
||||||
public AlarmJob(Preferences preferences, AlarmService alarmService, Notifier notifier, TaskDao taskDao) {
|
public AlarmJob() {
|
||||||
this.preferences = preferences;
|
super(AlarmJob.class.getSimpleName());
|
||||||
this.alarmService = alarmService;
|
|
||||||
this.notifier = notifier;
|
|
||||||
this.taskDao = taskDao;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
|
||||||
@Override
|
@Override
|
||||||
protected Result onRunJob(Params params) {
|
protected void run() {
|
||||||
try {
|
if (!preferences.isCurrentlyQuietHours()) {
|
||||||
if (!preferences.isCurrentlyQuietHours()) {
|
for (Alarm alarm : alarmService.removePastDueAlarms()) {
|
||||||
for (Alarm alarm : alarmService.removePastDueAlarms()) {
|
Task task = taskDao.fetch(alarm.getTaskId(), Task.REMINDER_LAST);
|
||||||
Task task = taskDao.fetch(alarm.getTaskId(), Task.REMINDER_LAST);
|
if (task != null && task.getReminderLast() < alarm.getTime()) {
|
||||||
if (task != null && task.getReminderLast() < alarm.getTime()) {
|
notifier.triggerTaskNotification(alarm.getTaskId(), ReminderService.TYPE_ALARM);
|
||||||
notifier.triggerTaskNotification(alarm.getTaskId(), ReminderService.TYPE_ALARM);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return Result.SUCCESS;
|
|
||||||
} finally {
|
|
||||||
alarmService.scheduleNextJob();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void scheduleNext() {
|
||||||
|
alarmService.scheduleNextJob();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void inject(IntentServiceComponent component) {
|
||||||
|
component.inject(this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,38 @@
|
|||||||
|
package org.tasks.jobs;
|
||||||
|
|
||||||
|
import android.content.Intent;
|
||||||
|
|
||||||
|
import org.tasks.analytics.Tracker;
|
||||||
|
import org.tasks.injection.InjectingIntentService;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import timber.log.Timber;
|
||||||
|
|
||||||
|
public abstract class Job extends InjectingIntentService {
|
||||||
|
|
||||||
|
@Inject Tracker tracker;
|
||||||
|
|
||||||
|
public Job(String name) {
|
||||||
|
super(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onHandleIntent(Intent intent) {
|
||||||
|
super.onHandleIntent(intent);
|
||||||
|
|
||||||
|
Timber.d("onHandleIntent(%s)", intent);
|
||||||
|
|
||||||
|
try {
|
||||||
|
run();
|
||||||
|
} catch (Exception e) {
|
||||||
|
tracker.reportException(e);
|
||||||
|
} finally {
|
||||||
|
scheduleNext();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract void run();
|
||||||
|
|
||||||
|
protected abstract void scheduleNext();
|
||||||
|
}
|
||||||
@ -1,68 +0,0 @@
|
|||||||
package org.tasks.jobs;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
|
|
||||||
import com.evernote.android.job.Job;
|
|
||||||
import com.todoroo.astrid.alarms.AlarmService;
|
|
||||||
import com.todoroo.astrid.backup.TasksXmlExporter;
|
|
||||||
import com.todoroo.astrid.dao.TaskDao;
|
|
||||||
import com.todoroo.astrid.reminders.ReminderService;
|
|
||||||
|
|
||||||
import org.tasks.Broadcaster;
|
|
||||||
import org.tasks.Notifier;
|
|
||||||
import org.tasks.injection.ApplicationScope;
|
|
||||||
import org.tasks.injection.ForApplication;
|
|
||||||
import org.tasks.preferences.Preferences;
|
|
||||||
import org.tasks.scheduling.RefreshScheduler;
|
|
||||||
|
|
||||||
import javax.inject.Inject;
|
|
||||||
|
|
||||||
@ApplicationScope
|
|
||||||
public class JobCreator implements com.evernote.android.job.JobCreator {
|
|
||||||
|
|
||||||
private final Context context;
|
|
||||||
private final Notifier notifier;
|
|
||||||
private final JobManager jobManager;
|
|
||||||
private final Broadcaster broadcaster;
|
|
||||||
private final TasksXmlExporter tasksXmlExporter;
|
|
||||||
private final Preferences preferences;
|
|
||||||
private final RefreshScheduler refreshScheduler;
|
|
||||||
private final AlarmService alarmService;
|
|
||||||
private final TaskDao taskDao;
|
|
||||||
private final ReminderService reminderService;
|
|
||||||
|
|
||||||
@Inject
|
|
||||||
public JobCreator(@ForApplication Context context, Notifier notifier, JobManager jobManager,
|
|
||||||
Broadcaster broadcaster, TasksXmlExporter tasksXmlExporter,
|
|
||||||
Preferences preferences, RefreshScheduler refreshScheduler,
|
|
||||||
AlarmService alarmService, TaskDao taskDao, ReminderService reminderService) {
|
|
||||||
this.context = context;
|
|
||||||
this.notifier = notifier;
|
|
||||||
this.jobManager = jobManager;
|
|
||||||
this.broadcaster = broadcaster;
|
|
||||||
this.tasksXmlExporter = tasksXmlExporter;
|
|
||||||
this.preferences = preferences;
|
|
||||||
this.refreshScheduler = refreshScheduler;
|
|
||||||
this.alarmService = alarmService;
|
|
||||||
this.taskDao = taskDao;
|
|
||||||
this.reminderService = reminderService;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Job create(String tag) {
|
|
||||||
switch (tag) {
|
|
||||||
case ReminderJob.TAG:
|
|
||||||
return new ReminderJob(preferences, reminderService, notifier);
|
|
||||||
case AlarmJob.TAG:
|
|
||||||
return new AlarmJob(preferences, alarmService, notifier, taskDao);
|
|
||||||
case RefreshJob.TAG:
|
|
||||||
return new RefreshJob(refreshScheduler, broadcaster);
|
|
||||||
case MidnightRefreshJob.TAG:
|
|
||||||
return new MidnightRefreshJob(broadcaster, jobManager);
|
|
||||||
case BackupJob.TAG:
|
|
||||||
return new BackupJob(context, jobManager, tasksXmlExporter, preferences);
|
|
||||||
default:
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,71 +1,78 @@
|
|||||||
package org.tasks.jobs;
|
package org.tasks.jobs;
|
||||||
|
|
||||||
|
import android.app.PendingIntent;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
import com.evernote.android.job.JobCreator;
|
|
||||||
import com.evernote.android.job.JobRequest;
|
|
||||||
|
|
||||||
import org.tasks.injection.ApplicationScope;
|
import org.tasks.injection.ApplicationScope;
|
||||||
import org.tasks.injection.ForApplication;
|
import org.tasks.injection.ForApplication;
|
||||||
|
import org.tasks.scheduling.AlarmManager;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import timber.log.Timber;
|
||||||
|
|
||||||
import static org.tasks.time.DateTimeUtils.currentTimeMillis;
|
import static org.tasks.time.DateTimeUtils.currentTimeMillis;
|
||||||
import static org.tasks.time.DateTimeUtils.nextMidnight;
|
import static org.tasks.time.DateTimeUtils.nextMidnight;
|
||||||
|
import static org.tasks.time.DateTimeUtils.printTimestamp;
|
||||||
|
|
||||||
@ApplicationScope
|
@ApplicationScope
|
||||||
public class JobManager {
|
public class JobManager {
|
||||||
|
|
||||||
private final com.evernote.android.job.JobManager jobManager;
|
private Context context;
|
||||||
|
private AlarmManager alarmManager;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public JobManager(@ForApplication Context context) {
|
public JobManager(@ForApplication Context context, AlarmManager alarmManager) {
|
||||||
jobManager = com.evernote.android.job.JobManager.create(context);
|
this.context = context;
|
||||||
jobManager.cancelAll();
|
this.alarmManager = alarmManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addJobCreator(JobCreator jobCreator) {
|
public void schedule(String tag, long time) {
|
||||||
jobManager.addJobCreator(jobCreator);
|
Timber.d("%s: %s", tag, printTimestamp(time));
|
||||||
|
alarmManager.wakeup(adjust(time), getPendingIntent(tag));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void schedule(String tag, long time, boolean cancelCurrent) {
|
public void scheduleRefresh(long time) {
|
||||||
new JobRequest.Builder(tag)
|
Timber.d("%s: %s", RefreshJob.TAG, printTimestamp(time));
|
||||||
.setExact(Math.max(time - currentTimeMillis(), 5000))
|
alarmManager.noWakeup(adjust(time), getPendingIntent(RefreshJob.class));
|
||||||
.setUpdateCurrent(cancelCurrent)
|
|
||||||
.build()
|
|
||||||
.schedule();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void scheduleRefresh(long time, boolean cancelExisting) {
|
public void scheduleMidnightRefresh() {
|
||||||
new JobRequest.Builder(RefreshJob.TAG)
|
long time = nextMidnight();
|
||||||
.setExact(Math.max(time - currentTimeMillis(), 5000))
|
Timber.d("%s: %s", MidnightRefreshJob.TAG, printTimestamp(time));
|
||||||
.setUpdateCurrent(cancelExisting)
|
alarmManager.noWakeup(adjust(time), getPendingIntent(MidnightRefreshJob.class));
|
||||||
.build()
|
|
||||||
.schedule();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void scheduleMidnightRefresh(boolean cancelExisting) {
|
public void scheduleMidnightBackup() {
|
||||||
scheduleMidnightJob(MidnightRefreshJob.TAG, cancelExisting);
|
long time = nextMidnight();
|
||||||
|
Timber.d("%s: %s", BackupJob.TAG, printTimestamp(time));
|
||||||
|
alarmManager.wakeup(adjust(time), getPendingIntent(BackupJob.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void scheduleMidnightBackup(boolean cancelExisting) {
|
public void cancel(String tag) {
|
||||||
scheduleMidnightJob(BackupJob.TAG, cancelExisting);
|
Timber.d("CXL %s", tag);
|
||||||
|
alarmManager.cancel(getPendingIntent(tag));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void scheduleMidnightJob(String tag, boolean cancelExisting) {
|
private long adjust(long time) {
|
||||||
long now = System.currentTimeMillis();
|
return Math.max(time, currentTimeMillis() + 5000);
|
||||||
new JobRequest.Builder(tag)
|
|
||||||
.setExact(nextMidnight(now) - now)
|
|
||||||
.setUpdateCurrent(cancelExisting)
|
|
||||||
.build()
|
|
||||||
.schedule();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void cancel(String tag) {
|
private PendingIntent getPendingIntent(String tag) {
|
||||||
jobManager.cancelAllForTag(tag);
|
switch (tag) {
|
||||||
|
case ReminderJob.TAG:
|
||||||
|
return getPendingIntent(ReminderJob.class);
|
||||||
|
case AlarmJob.TAG:
|
||||||
|
return getPendingIntent(AlarmJob.class);
|
||||||
|
case RefreshJob.TAG:
|
||||||
|
return getPendingIntent(RefreshJob.class);
|
||||||
|
default:
|
||||||
|
throw new RuntimeException("Unexpected tag: " + tag);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void cancelRefreshes() {
|
private <T> PendingIntent getPendingIntent(Class<T> c) {
|
||||||
jobManager.cancelAllForTag(RefreshJob.TAG);
|
return PendingIntent.getService(context, 0, new Intent(context, c), 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,7 @@
|
|||||||
|
package org.tasks.jobs;
|
||||||
|
|
||||||
|
public abstract class MidnightJob extends Job {
|
||||||
|
public MidnightJob(String name) {
|
||||||
|
super(name);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,31 +1,33 @@
|
|||||||
package org.tasks.jobs;
|
package org.tasks.jobs;
|
||||||
|
|
||||||
import android.support.annotation.NonNull;
|
|
||||||
|
|
||||||
import com.evernote.android.job.Job;
|
|
||||||
|
|
||||||
import org.tasks.Broadcaster;
|
import org.tasks.Broadcaster;
|
||||||
|
import org.tasks.injection.IntentServiceComponent;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
public class MidnightRefreshJob extends Job {
|
public class MidnightRefreshJob extends MidnightJob {
|
||||||
|
|
||||||
public static final String TAG = "job_midnight_refresh";
|
public static final String TAG = "job_midnight_refresh";
|
||||||
|
|
||||||
private final Broadcaster broadcaster;
|
@Inject Broadcaster broadcaster;
|
||||||
private final JobManager jobManager;
|
@Inject JobManager jobManager;
|
||||||
|
|
||||||
|
public MidnightRefreshJob() {
|
||||||
|
super(MidnightRefreshJob.class.getSimpleName());
|
||||||
|
}
|
||||||
|
|
||||||
public MidnightRefreshJob(Broadcaster broadcaster, JobManager jobManager) {
|
@Override
|
||||||
this.broadcaster = broadcaster;
|
protected void run() {
|
||||||
this.jobManager = jobManager;
|
broadcaster.refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void scheduleNext() {
|
||||||
|
jobManager.scheduleMidnightRefresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
|
||||||
@Override
|
@Override
|
||||||
protected Result onRunJob(Params params) {
|
protected void inject(IntentServiceComponent component) {
|
||||||
try {
|
component.inject(this);
|
||||||
broadcaster.refresh();
|
|
||||||
return Result.SUCCESS;
|
|
||||||
} finally {
|
|
||||||
jobManager.scheduleMidnightRefresh(false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,32 +1,34 @@
|
|||||||
package org.tasks.jobs;
|
package org.tasks.jobs;
|
||||||
|
|
||||||
import android.support.annotation.NonNull;
|
|
||||||
|
|
||||||
import com.evernote.android.job.Job;
|
|
||||||
|
|
||||||
import org.tasks.Broadcaster;
|
import org.tasks.Broadcaster;
|
||||||
|
import org.tasks.injection.IntentServiceComponent;
|
||||||
import org.tasks.scheduling.RefreshScheduler;
|
import org.tasks.scheduling.RefreshScheduler;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
public class RefreshJob extends Job {
|
public class RefreshJob extends Job {
|
||||||
|
|
||||||
public static final String TAG = "job_refresh";
|
public static final String TAG = "job_refresh";
|
||||||
|
|
||||||
private final RefreshScheduler refreshScheduler;
|
@Inject RefreshScheduler refreshScheduler;
|
||||||
private final Broadcaster broadcaster;
|
@Inject Broadcaster broadcaster;
|
||||||
|
|
||||||
|
public RefreshJob() {
|
||||||
|
super(RefreshJob.class.getSimpleName());
|
||||||
|
}
|
||||||
|
|
||||||
public RefreshJob(RefreshScheduler refreshScheduler, Broadcaster broadcaster) {
|
@Override
|
||||||
this.refreshScheduler = refreshScheduler;
|
protected void inject(IntentServiceComponent component) {
|
||||||
this.broadcaster = broadcaster;
|
component.inject(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void run() {
|
||||||
|
broadcaster.refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
|
||||||
@Override
|
@Override
|
||||||
protected Result onRunJob(Params params) {
|
protected void scheduleNext() {
|
||||||
try {
|
refreshScheduler.scheduleNext();
|
||||||
broadcaster.refresh();
|
|
||||||
return Result.SUCCESS;
|
|
||||||
} finally {
|
|
||||||
refreshScheduler.scheduleNext();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,39 +1,41 @@
|
|||||||
package org.tasks.jobs;
|
package org.tasks.jobs;
|
||||||
|
|
||||||
import android.support.annotation.NonNull;
|
|
||||||
|
|
||||||
import com.evernote.android.job.Job;
|
|
||||||
import com.todoroo.astrid.reminders.ReminderService;
|
import com.todoroo.astrid.reminders.ReminderService;
|
||||||
|
|
||||||
import org.tasks.Notifier;
|
import org.tasks.Notifier;
|
||||||
|
import org.tasks.injection.IntentServiceComponent;
|
||||||
import org.tasks.preferences.Preferences;
|
import org.tasks.preferences.Preferences;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
public class ReminderJob extends Job {
|
public class ReminderJob extends Job {
|
||||||
|
|
||||||
public static final String TAG = "job_reminder";
|
public static final String TAG = "job_reminder";
|
||||||
|
|
||||||
private final Preferences preferences;
|
@Inject Preferences preferences;
|
||||||
private final ReminderService reminderService;
|
@Inject ReminderService reminderService;
|
||||||
private final Notifier notifier;
|
@Inject Notifier notifier;
|
||||||
|
|
||||||
|
public ReminderJob() {
|
||||||
|
super(ReminderJob.class.getSimpleName());
|
||||||
|
}
|
||||||
|
|
||||||
public ReminderJob(Preferences preferences, ReminderService reminderService, Notifier notifier) {
|
@Override
|
||||||
this.preferences = preferences;
|
protected void inject(IntentServiceComponent component) {
|
||||||
this.reminderService = reminderService;
|
component.inject(this);
|
||||||
this.notifier = notifier;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
|
||||||
@Override
|
@Override
|
||||||
protected Result onRunJob(Params params) {
|
protected void run() {
|
||||||
try {
|
if (!preferences.isCurrentlyQuietHours()) {
|
||||||
if (!preferences.isCurrentlyQuietHours()) {
|
for (Reminder reminder : reminderService.getPastReminders()) {
|
||||||
for (Reminder reminder : reminderService.getPastReminders()) {
|
notifier.triggerTaskNotification(reminder.getId(), reminder.getType());
|
||||||
notifier.triggerTaskNotification(reminder.getId(), reminder.getType());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return Result.SUCCESS;
|
|
||||||
} finally {
|
|
||||||
reminderService.scheduleNextJob();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void scheduleNext() {
|
||||||
|
reminderService.scheduleNextJob();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<full-backup-content>
|
|
||||||
<exclude domain="sharedpref" path="evernote_jobs.xml" />
|
|
||||||
<exclude domain="database" path="evernote_jobs.db" />
|
|
||||||
</full-backup-content>
|
|
||||||
Loading…
Reference in New Issue