mirror of https://github.com/tasks/tasks
Replace android-job with intent services
parent
244ac6c9e6
commit
ac03c211e0
@ -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;
|
||||
|
||||
import android.app.PendingIntent;
|
||||
import android.content.Context;
|
||||
|
||||
import com.evernote.android.job.JobCreator;
|
||||
import com.evernote.android.job.JobRequest;
|
||||
import android.content.Intent;
|
||||
|
||||
import org.tasks.injection.ApplicationScope;
|
||||
import org.tasks.injection.ForApplication;
|
||||
import org.tasks.scheduling.AlarmManager;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import timber.log.Timber;
|
||||
|
||||
import static org.tasks.time.DateTimeUtils.currentTimeMillis;
|
||||
import static org.tasks.time.DateTimeUtils.nextMidnight;
|
||||
import static org.tasks.time.DateTimeUtils.printTimestamp;
|
||||
|
||||
@ApplicationScope
|
||||
public class JobManager {
|
||||
|
||||
private final com.evernote.android.job.JobManager jobManager;
|
||||
private Context context;
|
||||
private AlarmManager alarmManager;
|
||||
|
||||
@Inject
|
||||
public JobManager(@ForApplication Context context) {
|
||||
jobManager = com.evernote.android.job.JobManager.create(context);
|
||||
jobManager.cancelAll();
|
||||
public JobManager(@ForApplication Context context, AlarmManager alarmManager) {
|
||||
this.context = context;
|
||||
this.alarmManager = alarmManager;
|
||||
}
|
||||
|
||||
public void addJobCreator(JobCreator jobCreator) {
|
||||
jobManager.addJobCreator(jobCreator);
|
||||
public void schedule(String tag, long time) {
|
||||
Timber.d("%s: %s", tag, printTimestamp(time));
|
||||
alarmManager.wakeup(adjust(time), getPendingIntent(tag));
|
||||
}
|
||||
|
||||
public void schedule(String tag, long time, boolean cancelCurrent) {
|
||||
new JobRequest.Builder(tag)
|
||||
.setExact(Math.max(time - currentTimeMillis(), 5000))
|
||||
.setUpdateCurrent(cancelCurrent)
|
||||
.build()
|
||||
.schedule();
|
||||
public void scheduleRefresh(long time) {
|
||||
Timber.d("%s: %s", RefreshJob.TAG, printTimestamp(time));
|
||||
alarmManager.noWakeup(adjust(time), getPendingIntent(RefreshJob.class));
|
||||
}
|
||||
|
||||
public void scheduleRefresh(long time, boolean cancelExisting) {
|
||||
new JobRequest.Builder(RefreshJob.TAG)
|
||||
.setExact(Math.max(time - currentTimeMillis(), 5000))
|
||||
.setUpdateCurrent(cancelExisting)
|
||||
.build()
|
||||
.schedule();
|
||||
public void scheduleMidnightRefresh() {
|
||||
long time = nextMidnight();
|
||||
Timber.d("%s: %s", MidnightRefreshJob.TAG, printTimestamp(time));
|
||||
alarmManager.noWakeup(adjust(time), getPendingIntent(MidnightRefreshJob.class));
|
||||
}
|
||||
|
||||
public void scheduleMidnightRefresh(boolean cancelExisting) {
|
||||
scheduleMidnightJob(MidnightRefreshJob.TAG, cancelExisting);
|
||||
public void scheduleMidnightBackup() {
|
||||
long time = nextMidnight();
|
||||
Timber.d("%s: %s", BackupJob.TAG, printTimestamp(time));
|
||||
alarmManager.wakeup(adjust(time), getPendingIntent(BackupJob.class));
|
||||
}
|
||||
|
||||
public void scheduleMidnightBackup(boolean cancelExisting) {
|
||||
scheduleMidnightJob(BackupJob.TAG, cancelExisting);
|
||||
public void cancel(String tag) {
|
||||
Timber.d("CXL %s", tag);
|
||||
alarmManager.cancel(getPendingIntent(tag));
|
||||
}
|
||||
|
||||
private void scheduleMidnightJob(String tag, boolean cancelExisting) {
|
||||
long now = System.currentTimeMillis();
|
||||
new JobRequest.Builder(tag)
|
||||
.setExact(nextMidnight(now) - now)
|
||||
.setUpdateCurrent(cancelExisting)
|
||||
.build()
|
||||
.schedule();
|
||||
private long adjust(long time) {
|
||||
return Math.max(time, currentTimeMillis() + 5000);
|
||||
}
|
||||
|
||||
public void cancel(String tag) {
|
||||
jobManager.cancelAllForTag(tag);
|
||||
private PendingIntent getPendingIntent(String 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() {
|
||||
jobManager.cancelAllForTag(RefreshJob.TAG);
|
||||
private <T> PendingIntent getPendingIntent(Class<T> c) {
|
||||
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;
|
||||
|
||||
import android.support.annotation.NonNull;
|
||||
|
||||
import com.evernote.android.job.Job;
|
||||
|
||||
import org.tasks.Broadcaster;
|
||||
import org.tasks.injection.IntentServiceComponent;
|
||||
|
||||
public class MidnightRefreshJob extends Job {
|
||||
import javax.inject.Inject;
|
||||
|
||||
public class MidnightRefreshJob extends MidnightJob {
|
||||
|
||||
public static final String TAG = "job_midnight_refresh";
|
||||
|
||||
private final Broadcaster broadcaster;
|
||||
private final JobManager jobManager;
|
||||
@Inject Broadcaster broadcaster;
|
||||
@Inject JobManager jobManager;
|
||||
|
||||
public MidnightRefreshJob(Broadcaster broadcaster, JobManager jobManager) {
|
||||
this.broadcaster = broadcaster;
|
||||
this.jobManager = jobManager;
|
||||
public MidnightRefreshJob() {
|
||||
super(MidnightRefreshJob.class.getSimpleName());
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
protected Result onRunJob(Params params) {
|
||||
try {
|
||||
protected void run() {
|
||||
broadcaster.refresh();
|
||||
return Result.SUCCESS;
|
||||
} finally {
|
||||
jobManager.scheduleMidnightRefresh(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void scheduleNext() {
|
||||
jobManager.scheduleMidnightRefresh();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void inject(IntentServiceComponent component) {
|
||||
component.inject(this);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,32 +1,34 @@
|
||||
package org.tasks.jobs;
|
||||
|
||||
import android.support.annotation.NonNull;
|
||||
|
||||
import com.evernote.android.job.Job;
|
||||
|
||||
import org.tasks.Broadcaster;
|
||||
import org.tasks.injection.IntentServiceComponent;
|
||||
import org.tasks.scheduling.RefreshScheduler;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
public class RefreshJob extends Job {
|
||||
|
||||
public static final String TAG = "job_refresh";
|
||||
|
||||
private final RefreshScheduler refreshScheduler;
|
||||
private final Broadcaster broadcaster;
|
||||
@Inject RefreshScheduler refreshScheduler;
|
||||
@Inject Broadcaster broadcaster;
|
||||
|
||||
public RefreshJob() {
|
||||
super(RefreshJob.class.getSimpleName());
|
||||
}
|
||||
|
||||
public RefreshJob(RefreshScheduler refreshScheduler, Broadcaster broadcaster) {
|
||||
this.refreshScheduler = refreshScheduler;
|
||||
this.broadcaster = broadcaster;
|
||||
@Override
|
||||
protected void inject(IntentServiceComponent component) {
|
||||
component.inject(this);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
protected Result onRunJob(Params params) {
|
||||
try {
|
||||
protected void run() {
|
||||
broadcaster.refresh();
|
||||
return Result.SUCCESS;
|
||||
} finally {
|
||||
refreshScheduler.scheduleNext();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void scheduleNext() {
|
||||
refreshScheduler.scheduleNext();
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,39 +1,41 @@
|
||||
package org.tasks.jobs;
|
||||
|
||||
import android.support.annotation.NonNull;
|
||||
|
||||
import com.evernote.android.job.Job;
|
||||
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 final String TAG = "job_reminder";
|
||||
|
||||
private final Preferences preferences;
|
||||
private final ReminderService reminderService;
|
||||
private final Notifier notifier;
|
||||
@Inject Preferences preferences;
|
||||
@Inject ReminderService reminderService;
|
||||
@Inject Notifier notifier;
|
||||
|
||||
public ReminderJob(Preferences preferences, ReminderService reminderService, Notifier notifier) {
|
||||
this.preferences = preferences;
|
||||
this.reminderService = reminderService;
|
||||
this.notifier = notifier;
|
||||
public ReminderJob() {
|
||||
super(ReminderJob.class.getSimpleName());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void inject(IntentServiceComponent component) {
|
||||
component.inject(this);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
protected Result onRunJob(Params params) {
|
||||
try {
|
||||
protected void run() {
|
||||
if (!preferences.isCurrentlyQuietHours()) {
|
||||
for (Reminder reminder : reminderService.getPastReminders()) {
|
||||
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