Add InjectingJob

pull/685/merge
Alex Baker 7 years ago
parent a496040222
commit f0fd3fa944

@ -77,7 +77,6 @@ public class BackupServiceTests extends InjectingTestCase {
} }
} }
@Ignore
@Test @Test
public void testBackup() { public void testBackup() {
assertEquals(0, temporaryDirectory.list().length); assertEquals(0, temporaryDirectory.list().length);

@ -20,4 +20,6 @@ public interface ApplicationComponent {
BroadcastComponent plus(BroadcastModule module); BroadcastComponent plus(BroadcastModule module);
IntentServiceComponent plus(IntentServiceModule module); IntentServiceComponent plus(IntentServiceModule module);
JobComponent plus(JobModule module);
} }

@ -0,0 +1,18 @@
package org.tasks.injection;
import android.support.annotation.NonNull;
import com.evernote.android.job.Job;
public abstract class InjectingJob extends Job {
@NonNull
@Override
protected Result onRunJob(@NonNull Params params) {
JobComponent component =
Dagger.get(getContext()).getApplicationComponent().plus(new JobModule());
inject(component);
return Result.SUCCESS;
}
protected abstract void inject(JobComponent component);
}

@ -0,0 +1,26 @@
package org.tasks.injection;
import dagger.Subcomponent;
import org.tasks.jobs.AfterSaveIntentService;
import org.tasks.jobs.BackupJob;
import org.tasks.jobs.NotificationJob;
import org.tasks.jobs.RefreshJob;
import org.tasks.jobs.SyncJob;
import org.tasks.locale.receiver.TaskerIntentService;
import org.tasks.location.GeofenceTransitionsIntentService;
import org.tasks.scheduling.BackgroundScheduler;
import org.tasks.scheduling.CalendarNotificationIntentService;
import org.tasks.scheduling.GeofenceSchedulingIntentService;
import org.tasks.scheduling.NotificationSchedulerIntentService;
@Subcomponent(modules = JobModule.class)
public interface JobComponent {
void inject(SyncJob syncJob);
void inject(NotificationJob notificationJob);
void inject(BackupJob backupJob);
void inject(RefreshJob refreshJob);
}

@ -0,0 +1,6 @@
package org.tasks.injection;
import dagger.Module;
@Module
public class JobModule {}

@ -6,18 +6,21 @@ import static java.util.Collections.emptyList;
import android.content.Context; import android.content.Context;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import com.evernote.android.job.Job;
import java.io.File; import java.io.File;
import java.io.FileFilter; import java.io.FileFilter;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;
import javax.inject.Inject;
import org.tasks.backup.TasksJsonExporter; import org.tasks.backup.TasksJsonExporter;
import org.tasks.injection.ForApplication;
import org.tasks.injection.InjectingJob;
import org.tasks.injection.JobComponent;
import org.tasks.preferences.Preferences; import org.tasks.preferences.Preferences;
import timber.log.Timber; import timber.log.Timber;
public class BackupJob extends Job { public class BackupJob extends InjectingJob {
static final String BACKUP_FILE_NAME_REGEX = "auto\\.[-\\d]+\\.json"; static final String BACKUP_FILE_NAME_REGEX = "auto\\.[-\\d]+\\.json";
static final FileFilter FILE_FILTER = f -> f.getName().matches(BACKUP_FILE_NAME_REGEX); static final FileFilter FILE_FILTER = f -> f.getName().matches(BACKUP_FILE_NAME_REGEX);
@ -25,15 +28,9 @@ public class BackupJob extends Job {
(f1, f2) -> Long.compare(f2.lastModified(), f1.lastModified()); (f1, f2) -> Long.compare(f2.lastModified(), f1.lastModified());
private static final int DAYS_TO_KEEP_BACKUP = 7; private static final int DAYS_TO_KEEP_BACKUP = 7;
private final Context context; @Inject @ForApplication Context context;
private final TasksJsonExporter tasksJsonExporter; @Inject TasksJsonExporter tasksJsonExporter;
private final Preferences preferences; @Inject Preferences preferences;
BackupJob(Context context, TasksJsonExporter tasksJsonExporter, Preferences preferences) {
this.context = context;
this.tasksJsonExporter = tasksJsonExporter;
this.preferences = preferences;
}
static List<File> getDeleteList(File[] fileArray, int keepNewest) { static List<File> getDeleteList(File[] fileArray, int keepNewest) {
if (fileArray == null) { if (fileArray == null) {
@ -45,13 +42,30 @@ public class BackupJob extends Job {
return newArrayList(skip(files, keepNewest)); return newArrayList(skip(files, keepNewest));
} }
public BackupJob() {
}
BackupJob(Context context, TasksJsonExporter tasksJsonExporter, Preferences preferences) {
this.context = context;
this.tasksJsonExporter = tasksJsonExporter;
this.preferences = preferences;
}
@NonNull @NonNull
@Override @Override
protected Result onRunJob(@NonNull Params params) { protected Result onRunJob(@NonNull Params params) {
super.onRunJob(params);
startBackup(context); startBackup(context);
return Result.SUCCESS; return Result.SUCCESS;
} }
@Override
protected void inject(JobComponent component) {
component.inject(this);
}
void startBackup(Context context) { void startBackup(Context context) {
try { try {
deleteOldBackups(); deleteOldBackups();

@ -1,19 +1,10 @@
package org.tasks.jobs; package org.tasks.jobs;
import android.content.Context;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import com.evernote.android.job.Job; import com.evernote.android.job.Job;
import javax.inject.Inject; import javax.inject.Inject;
import org.tasks.LocalBroadcastManager;
import org.tasks.Notifier;
import org.tasks.backup.TasksJsonExporter;
import org.tasks.caldav.CaldavSynchronizer;
import org.tasks.gtasks.GoogleTaskSynchronizer;
import org.tasks.injection.ApplicationScope; import org.tasks.injection.ApplicationScope;
import org.tasks.injection.ForApplication;
import org.tasks.preferences.Preferences;
import org.tasks.scheduling.RefreshScheduler;
import timber.log.Timber; import timber.log.Timber;
@ApplicationScope @ApplicationScope
@ -25,53 +16,24 @@ public class JobCreator implements com.evernote.android.job.JobCreator {
static final String TAG_NOTIFICATION = "tag_notification"; static final String TAG_NOTIFICATION = "tag_notification";
static final String TAG_BACKGROUND_SYNC = "tag_background_sync"; static final String TAG_BACKGROUND_SYNC = "tag_background_sync";
static final String TAG_SYNC = "tag_sync"; static final String TAG_SYNC = "tag_sync";
private final Context context;
private final Preferences preferences;
private final Notifier notifier;
private final NotificationQueue notificationQueue;
private final TasksJsonExporter tasksJsonExporter;
private final RefreshScheduler refreshScheduler;
private final LocalBroadcastManager localBroadcastManager;
private final CaldavSynchronizer caldavSynchronizer;
private final GoogleTaskSynchronizer googleTaskSynchronizer;
@Inject @Inject
public JobCreator( public JobCreator() {}
@ForApplication Context context,
Preferences preferences,
Notifier notifier,
NotificationQueue notificationQueue,
TasksJsonExporter tasksJsonExporter,
RefreshScheduler refreshScheduler,
LocalBroadcastManager localBroadcastManager,
CaldavSynchronizer caldavSynchronizer,
GoogleTaskSynchronizer googleTaskSynchronizer) {
this.context = context;
this.preferences = preferences;
this.notifier = notifier;
this.notificationQueue = notificationQueue;
this.tasksJsonExporter = tasksJsonExporter;
this.refreshScheduler = refreshScheduler;
this.localBroadcastManager = localBroadcastManager;
this.caldavSynchronizer = caldavSynchronizer;
this.googleTaskSynchronizer = googleTaskSynchronizer;
}
@Nullable @Nullable
@Override @Override
public Job create(@NonNull String tag) { public Job create(@NonNull String tag) {
switch (tag) { switch (tag) {
case TAG_NOTIFICATION: case TAG_NOTIFICATION:
return new NotificationJob(preferences, notifier, notificationQueue); return new NotificationJob();
case TAG_SYNC: case TAG_SYNC:
case TAG_BACKGROUND_SYNC: case TAG_BACKGROUND_SYNC:
return new SyncJob( return new SyncJob();
caldavSynchronizer, googleTaskSynchronizer, localBroadcastManager, preferences);
case TAG_BACKUP: case TAG_BACKUP:
return new BackupJob(context, tasksJsonExporter, preferences); return new BackupJob();
case TAG_MIDNIGHT_REFRESH: case TAG_MIDNIGHT_REFRESH:
case TAG_REFRESH: case TAG_REFRESH:
return new RefreshJob(refreshScheduler, localBroadcastManager); return new RefreshJob();
default: default:
Timber.e("Unhandled tag: %s", tag); Timber.e("Unhandled tag: %s", tag);
return null; return null;

@ -2,25 +2,24 @@ package org.tasks.jobs;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import java.util.List; import java.util.List;
import javax.inject.Inject;
import org.tasks.BuildConfig; import org.tasks.BuildConfig;
import org.tasks.Notifier; import org.tasks.Notifier;
import org.tasks.injection.InjectingJob;
import org.tasks.injection.JobComponent;
import org.tasks.preferences.Preferences; import org.tasks.preferences.Preferences;
public class NotificationJob extends com.evernote.android.job.Job { public class NotificationJob extends InjectingJob {
private final Preferences preferences; @Inject Preferences preferences;
private final Notifier notifier; @Inject Notifier notifier;
private final NotificationQueue notificationQueue; @Inject NotificationQueue notificationQueue;
NotificationJob(Preferences preferences, Notifier notifier, NotificationQueue notificationQueue) {
this.preferences = preferences;
this.notifier = notifier;
this.notificationQueue = notificationQueue;
}
@NonNull @NonNull
@Override @Override
protected Result onRunJob(@NonNull Params params) { protected Result onRunJob(@NonNull Params params) {
super.onRunJob(params);
if (!preferences.isCurrentlyQuietHours()) { if (!preferences.isCurrentlyQuietHours()) {
List<? extends NotificationQueueEntry> overdueJobs = notificationQueue.getOverdueJobs(); List<? extends NotificationQueueEntry> overdueJobs = notificationQueue.getOverdueJobs();
notifier.triggerTaskNotifications(overdueJobs); notifier.triggerTaskNotifications(overdueJobs);
@ -32,4 +31,9 @@ public class NotificationJob extends com.evernote.android.job.Job {
notificationQueue.scheduleNext(); notificationQueue.scheduleNext();
return Result.SUCCESS; return Result.SUCCESS;
} }
@Override
protected void inject(JobComponent component) {
component.inject(this);
}
} }

@ -1,27 +1,31 @@
package org.tasks.jobs; package org.tasks.jobs;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import com.evernote.android.job.Job; import javax.inject.Inject;
import org.tasks.LocalBroadcastManager; import org.tasks.LocalBroadcastManager;
import org.tasks.injection.InjectingJob;
import org.tasks.injection.JobComponent;
import org.tasks.scheduling.RefreshScheduler; import org.tasks.scheduling.RefreshScheduler;
public class RefreshJob extends Job { public class RefreshJob extends InjectingJob {
public static final String TAG = "job_refresh"; public static final String TAG = "job_refresh";
private final RefreshScheduler refreshScheduler; @Inject RefreshScheduler refreshScheduler;
private final LocalBroadcastManager localBroadcastManager; @Inject LocalBroadcastManager localBroadcastManager;
RefreshJob(RefreshScheduler refreshScheduler, LocalBroadcastManager localBroadcastManager) {
this.refreshScheduler = refreshScheduler;
this.localBroadcastManager = localBroadcastManager;
}
@NonNull @NonNull
@Override @Override
protected Result onRunJob(@NonNull Params params) { protected Result onRunJob(@NonNull Params params) {
super.onRunJob(params);
localBroadcastManager.broadcastRefresh(); localBroadcastManager.broadcastRefresh();
refreshScheduler.scheduleNext(); refreshScheduler.scheduleNext();
return Result.SUCCESS; return Result.SUCCESS;
} }
@Override
protected void inject(JobComponent component) {
component.inject(this);
}
} }

@ -1,36 +1,29 @@
package org.tasks.jobs; package org.tasks.jobs;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import com.evernote.android.job.Job; import javax.inject.Inject;
import org.tasks.LocalBroadcastManager; import org.tasks.LocalBroadcastManager;
import org.tasks.caldav.CaldavSynchronizer; import org.tasks.caldav.CaldavSynchronizer;
import org.tasks.gtasks.GoogleTaskSynchronizer; import org.tasks.gtasks.GoogleTaskSynchronizer;
import org.tasks.injection.InjectingJob;
import org.tasks.injection.JobComponent;
import org.tasks.preferences.Preferences; import org.tasks.preferences.Preferences;
import timber.log.Timber; import timber.log.Timber;
public class SyncJob extends Job { public class SyncJob extends InjectingJob {
private static final Object LOCK = new Object(); private static final Object LOCK = new Object();
private final CaldavSynchronizer caldavSynchronizer; @Inject CaldavSynchronizer caldavSynchronizer;
private final GoogleTaskSynchronizer googleTaskSynchronizer; @Inject GoogleTaskSynchronizer googleTaskSynchronizer;
private final LocalBroadcastManager localBroadcastManager; @Inject LocalBroadcastManager localBroadcastManager;
private final Preferences preferences; @Inject Preferences preferences;
SyncJob(
CaldavSynchronizer caldavSynchronizer,
GoogleTaskSynchronizer googleTaskSynchronizer,
LocalBroadcastManager localBroadcastManager,
Preferences preferences) {
this.caldavSynchronizer = caldavSynchronizer;
this.googleTaskSynchronizer = googleTaskSynchronizer;
this.localBroadcastManager = localBroadcastManager;
this.preferences = preferences;
}
@NonNull @NonNull
@Override @Override
protected Result onRunJob(@NonNull Params params) { protected Result onRunJob(@NonNull Params params) {
super.onRunJob(params);
synchronized (LOCK) { synchronized (LOCK) {
if (preferences.isSyncOngoing()) { if (preferences.isSyncOngoing()) {
return Result.RESCHEDULE; return Result.RESCHEDULE;
@ -50,4 +43,9 @@ public class SyncJob extends Job {
} }
return Result.SUCCESS; return Result.SUCCESS;
} }
@Override
protected void inject(JobComponent component) {
component.inject(this);
}
} }

Loading…
Cancel
Save