From f0fd3fa944aaa125cedbc631a46ca05a4e074be6 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Fri, 20 Apr 2018 10:44:54 -0500 Subject: [PATCH] Add InjectingJob --- .../org/tasks/jobs/BackupServiceTests.java | 1 - .../tasks/injection/ApplicationComponent.java | 2 + .../org/tasks/injection/InjectingJob.java | 18 +++++++ .../org/tasks/injection/JobComponent.java | 26 ++++++++++ .../java/org/tasks/injection/JobModule.java | 6 +++ .../main/java/org/tasks/jobs/BackupJob.java | 36 +++++++++----- .../main/java/org/tasks/jobs/JobCreator.java | 48 ++----------------- .../java/org/tasks/jobs/NotificationJob.java | 24 ++++++---- .../main/java/org/tasks/jobs/RefreshJob.java | 22 +++++---- app/src/main/java/org/tasks/jobs/SyncJob.java | 32 ++++++------- 10 files changed, 124 insertions(+), 91 deletions(-) create mode 100644 app/src/main/java/org/tasks/injection/InjectingJob.java create mode 100644 app/src/main/java/org/tasks/injection/JobComponent.java create mode 100644 app/src/main/java/org/tasks/injection/JobModule.java diff --git a/app/src/androidTest/java/org/tasks/jobs/BackupServiceTests.java b/app/src/androidTest/java/org/tasks/jobs/BackupServiceTests.java index f47915cbb..2591f4cda 100644 --- a/app/src/androidTest/java/org/tasks/jobs/BackupServiceTests.java +++ b/app/src/androidTest/java/org/tasks/jobs/BackupServiceTests.java @@ -77,7 +77,6 @@ public class BackupServiceTests extends InjectingTestCase { } } - @Ignore @Test public void testBackup() { assertEquals(0, temporaryDirectory.list().length); diff --git a/app/src/main/java/org/tasks/injection/ApplicationComponent.java b/app/src/main/java/org/tasks/injection/ApplicationComponent.java index f59ece469..f5cf858e5 100644 --- a/app/src/main/java/org/tasks/injection/ApplicationComponent.java +++ b/app/src/main/java/org/tasks/injection/ApplicationComponent.java @@ -20,4 +20,6 @@ public interface ApplicationComponent { BroadcastComponent plus(BroadcastModule module); IntentServiceComponent plus(IntentServiceModule module); + + JobComponent plus(JobModule module); } diff --git a/app/src/main/java/org/tasks/injection/InjectingJob.java b/app/src/main/java/org/tasks/injection/InjectingJob.java new file mode 100644 index 000000000..eaa02511c --- /dev/null +++ b/app/src/main/java/org/tasks/injection/InjectingJob.java @@ -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); +} diff --git a/app/src/main/java/org/tasks/injection/JobComponent.java b/app/src/main/java/org/tasks/injection/JobComponent.java new file mode 100644 index 000000000..2fe98d858 --- /dev/null +++ b/app/src/main/java/org/tasks/injection/JobComponent.java @@ -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); +} diff --git a/app/src/main/java/org/tasks/injection/JobModule.java b/app/src/main/java/org/tasks/injection/JobModule.java new file mode 100644 index 000000000..e5bd2798b --- /dev/null +++ b/app/src/main/java/org/tasks/injection/JobModule.java @@ -0,0 +1,6 @@ +package org.tasks.injection; + +import dagger.Module; + +@Module +public class JobModule {} diff --git a/app/src/main/java/org/tasks/jobs/BackupJob.java b/app/src/main/java/org/tasks/jobs/BackupJob.java index 421ef4c7c..27e2395d6 100644 --- a/app/src/main/java/org/tasks/jobs/BackupJob.java +++ b/app/src/main/java/org/tasks/jobs/BackupJob.java @@ -6,18 +6,21 @@ import static java.util.Collections.emptyList; import android.content.Context; import android.support.annotation.NonNull; -import com.evernote.android.job.Job; import java.io.File; import java.io.FileFilter; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.List; +import javax.inject.Inject; 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 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 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()); private static final int DAYS_TO_KEEP_BACKUP = 7; - private final Context context; - private final TasksJsonExporter tasksJsonExporter; - private final Preferences preferences; - - BackupJob(Context context, TasksJsonExporter tasksJsonExporter, Preferences preferences) { - this.context = context; - this.tasksJsonExporter = tasksJsonExporter; - this.preferences = preferences; - } + @Inject @ForApplication Context context; + @Inject TasksJsonExporter tasksJsonExporter; + @Inject Preferences preferences; static List getDeleteList(File[] fileArray, int keepNewest) { if (fileArray == null) { @@ -45,13 +42,30 @@ public class BackupJob extends Job { return newArrayList(skip(files, keepNewest)); } + public BackupJob() { + + } + + BackupJob(Context context, TasksJsonExporter tasksJsonExporter, Preferences preferences) { + this.context = context; + this.tasksJsonExporter = tasksJsonExporter; + this.preferences = preferences; + } + @NonNull @Override protected Result onRunJob(@NonNull Params params) { + super.onRunJob(params); + startBackup(context); return Result.SUCCESS; } + @Override + protected void inject(JobComponent component) { + component.inject(this); + } + void startBackup(Context context) { try { deleteOldBackups(); diff --git a/app/src/main/java/org/tasks/jobs/JobCreator.java b/app/src/main/java/org/tasks/jobs/JobCreator.java index aacd9a674..29eb0f8f7 100644 --- a/app/src/main/java/org/tasks/jobs/JobCreator.java +++ b/app/src/main/java/org/tasks/jobs/JobCreator.java @@ -1,19 +1,10 @@ package org.tasks.jobs; -import android.content.Context; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import com.evernote.android.job.Job; 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.ForApplication; -import org.tasks.preferences.Preferences; -import org.tasks.scheduling.RefreshScheduler; import timber.log.Timber; @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_BACKGROUND_SYNC = "tag_background_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 - 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; - } + public JobCreator() {} @Nullable @Override public Job create(@NonNull String tag) { switch (tag) { case TAG_NOTIFICATION: - return new NotificationJob(preferences, notifier, notificationQueue); + return new NotificationJob(); case TAG_SYNC: case TAG_BACKGROUND_SYNC: - return new SyncJob( - caldavSynchronizer, googleTaskSynchronizer, localBroadcastManager, preferences); + return new SyncJob(); case TAG_BACKUP: - return new BackupJob(context, tasksJsonExporter, preferences); + return new BackupJob(); case TAG_MIDNIGHT_REFRESH: case TAG_REFRESH: - return new RefreshJob(refreshScheduler, localBroadcastManager); + return new RefreshJob(); default: Timber.e("Unhandled tag: %s", tag); return null; diff --git a/app/src/main/java/org/tasks/jobs/NotificationJob.java b/app/src/main/java/org/tasks/jobs/NotificationJob.java index de20949ca..dc817b708 100644 --- a/app/src/main/java/org/tasks/jobs/NotificationJob.java +++ b/app/src/main/java/org/tasks/jobs/NotificationJob.java @@ -2,25 +2,24 @@ package org.tasks.jobs; import android.support.annotation.NonNull; import java.util.List; +import javax.inject.Inject; import org.tasks.BuildConfig; import org.tasks.Notifier; +import org.tasks.injection.InjectingJob; +import org.tasks.injection.JobComponent; import org.tasks.preferences.Preferences; -public class NotificationJob extends com.evernote.android.job.Job { +public class NotificationJob extends InjectingJob { - private final Preferences preferences; - private final Notifier notifier; - private final NotificationQueue notificationQueue; - - NotificationJob(Preferences preferences, Notifier notifier, NotificationQueue notificationQueue) { - this.preferences = preferences; - this.notifier = notifier; - this.notificationQueue = notificationQueue; - } + @Inject Preferences preferences; + @Inject Notifier notifier; + @Inject NotificationQueue notificationQueue; @NonNull @Override protected Result onRunJob(@NonNull Params params) { + super.onRunJob(params); + if (!preferences.isCurrentlyQuietHours()) { List overdueJobs = notificationQueue.getOverdueJobs(); notifier.triggerTaskNotifications(overdueJobs); @@ -32,4 +31,9 @@ public class NotificationJob extends com.evernote.android.job.Job { notificationQueue.scheduleNext(); return Result.SUCCESS; } + + @Override + protected void inject(JobComponent component) { + component.inject(this); + } } diff --git a/app/src/main/java/org/tasks/jobs/RefreshJob.java b/app/src/main/java/org/tasks/jobs/RefreshJob.java index dab033286..32ce806a4 100644 --- a/app/src/main/java/org/tasks/jobs/RefreshJob.java +++ b/app/src/main/java/org/tasks/jobs/RefreshJob.java @@ -1,27 +1,31 @@ package org.tasks.jobs; import android.support.annotation.NonNull; -import com.evernote.android.job.Job; +import javax.inject.Inject; import org.tasks.LocalBroadcastManager; +import org.tasks.injection.InjectingJob; +import org.tasks.injection.JobComponent; import org.tasks.scheduling.RefreshScheduler; -public class RefreshJob extends Job { +public class RefreshJob extends InjectingJob { public static final String TAG = "job_refresh"; - private final RefreshScheduler refreshScheduler; - private final LocalBroadcastManager localBroadcastManager; - - RefreshJob(RefreshScheduler refreshScheduler, LocalBroadcastManager localBroadcastManager) { - this.refreshScheduler = refreshScheduler; - this.localBroadcastManager = localBroadcastManager; - } + @Inject RefreshScheduler refreshScheduler; + @Inject LocalBroadcastManager localBroadcastManager; @NonNull @Override protected Result onRunJob(@NonNull Params params) { + super.onRunJob(params); + localBroadcastManager.broadcastRefresh(); refreshScheduler.scheduleNext(); return Result.SUCCESS; } + + @Override + protected void inject(JobComponent component) { + component.inject(this); + } } diff --git a/app/src/main/java/org/tasks/jobs/SyncJob.java b/app/src/main/java/org/tasks/jobs/SyncJob.java index 925619c52..568bc4599 100644 --- a/app/src/main/java/org/tasks/jobs/SyncJob.java +++ b/app/src/main/java/org/tasks/jobs/SyncJob.java @@ -1,36 +1,29 @@ package org.tasks.jobs; import android.support.annotation.NonNull; -import com.evernote.android.job.Job; +import javax.inject.Inject; import org.tasks.LocalBroadcastManager; import org.tasks.caldav.CaldavSynchronizer; import org.tasks.gtasks.GoogleTaskSynchronizer; +import org.tasks.injection.InjectingJob; +import org.tasks.injection.JobComponent; import org.tasks.preferences.Preferences; import timber.log.Timber; -public class SyncJob extends Job { +public class SyncJob extends InjectingJob { private static final Object LOCK = new Object(); - private final CaldavSynchronizer caldavSynchronizer; - private final GoogleTaskSynchronizer googleTaskSynchronizer; - private final LocalBroadcastManager localBroadcastManager; - private final Preferences preferences; - - SyncJob( - CaldavSynchronizer caldavSynchronizer, - GoogleTaskSynchronizer googleTaskSynchronizer, - LocalBroadcastManager localBroadcastManager, - Preferences preferences) { - this.caldavSynchronizer = caldavSynchronizer; - this.googleTaskSynchronizer = googleTaskSynchronizer; - this.localBroadcastManager = localBroadcastManager; - this.preferences = preferences; - } + @Inject CaldavSynchronizer caldavSynchronizer; + @Inject GoogleTaskSynchronizer googleTaskSynchronizer; + @Inject LocalBroadcastManager localBroadcastManager; + @Inject Preferences preferences; @NonNull @Override protected Result onRunJob(@NonNull Params params) { + super.onRunJob(params); + synchronized (LOCK) { if (preferences.isSyncOngoing()) { return Result.RESCHEDULE; @@ -50,4 +43,9 @@ public class SyncJob extends Job { } return Result.SUCCESS; } + + @Override + protected void inject(JobComponent component) { + component.inject(this); + } }