diff --git a/build.gradle b/build.gradle index 7f9f59112..88d1b2fa9 100644 --- a/build.gradle +++ b/build.gradle @@ -134,7 +134,6 @@ dependencies { compile 'com.google.android.apps.dashclock:dashclock-api:2.0.0' compile 'com.twofortyfouram:android-plugin-api-for-locale:1.0.2' compile 'com.bignerdranch.android:recyclerview-multiselect:0.2' - compile 'com.evernote:android-job:1.1.8' compile ('com.rubiconproject.oss:jchronic:0.2.6') { transitive = false } diff --git a/proguard.pro b/proguard.pro index dc35f0397..ad3166581 100644 --- a/proguard.pro +++ b/proguard.pro @@ -37,13 +37,3 @@ # https://github.com/facebook/stetho/blob/2807d4248c6fa06cdd3626b6afb9bfc42ba50d55/stetho/proguard-consumer.pro -keep class com.facebook.stetho.** { *; } -dontwarn com.facebook.stetho.** - -# https://github.com/evernote/android-job/blob/7f81ac43d0b161f4f0bed1e02c2455a3cda57041/library/proguard.txt --dontwarn com.evernote.android.job.gcm.** --dontwarn com.evernote.android.job.util.GcmAvailableHelper - --keep public class com.evernote.android.job.v21.PlatformJobService --keep public class com.evernote.android.job.v14.PlatformAlarmService --keep public class com.evernote.android.job.v14.PlatformAlarmReceiver --keep public class com.evernote.android.job.JobBootReceiver --keep public class com.evernote.android.job.JobRescheduleService \ No newline at end of file diff --git a/src/androidTest/java/org/tasks/jobs/BackupServiceTests.java b/src/androidTest/java/org/tasks/jobs/BackupServiceTests.java index b1aebe625..67359247b 100644 --- a/src/androidTest/java/org/tasks/jobs/BackupServiceTests.java +++ b/src/androidTest/java/org/tasks/jobs/BackupServiceTests.java @@ -19,6 +19,7 @@ import org.junit.runner.RunWith; import org.tasks.R; import org.tasks.injection.TestComponent; import org.tasks.preferences.Preferences; +import org.tasks.scheduling.AlarmManager; import java.io.File; import java.io.IOException; @@ -29,6 +30,7 @@ import static android.support.test.InstrumentationRegistry.getTargetContext; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertTrue; +import static org.mockito.Mockito.mock; import static org.tasks.date.DateTimeUtils.newDateTime; import static org.tasks.time.DateTimeUtils.currentTimeMillis; @@ -90,7 +92,7 @@ public class BackupServiceTests extends DatabaseTestCase { preferences.setLong(TasksXmlExporter.PREF_BACKUP_LAST_DATE, 0); // create a backup - BackupJob service = new BackupJob(getTargetContext(), new JobManager(getTargetContext()), xmlExporter, preferences); + BackupJob service = new BackupJob(getTargetContext(), new JobManager(getTargetContext(), mock(AlarmManager.class)), xmlExporter, preferences); service.startBackup(getTargetContext()); AndroidUtilities.sleepDeep(BACKUP_WAIT_TIME); @@ -128,7 +130,7 @@ public class BackupServiceTests extends DatabaseTestCase { assertEquals(11, files.length); // backup - BackupJob service = new BackupJob(getTargetContext(), new JobManager(getTargetContext()), xmlExporter, preferences); + BackupJob service = new BackupJob(getTargetContext(), new JobManager(getTargetContext(), mock(AlarmManager.class)), xmlExporter, preferences); service.startBackup(getTargetContext()); AndroidUtilities.sleepDeep(BACKUP_WAIT_TIME); diff --git a/src/androidTest/java/org/tasks/jobs/JobQueueTest.java b/src/androidTest/java/org/tasks/jobs/JobQueueTest.java index d21ddb919..dba4dcbf9 100644 --- a/src/androidTest/java/org/tasks/jobs/JobQueueTest.java +++ b/src/androidTest/java/org/tasks/jobs/JobQueueTest.java @@ -53,7 +53,7 @@ public class JobQueueTest { queue.add(new Reminder(1, 1, 0)); queue.add(new Reminder(2, 1, 0)); - verify(jobManager).schedule(TAG, 1, true); + verify(jobManager).schedule(TAG, 1); assertEquals(2, queue.size()); } @@ -62,7 +62,7 @@ public class JobQueueTest { public void rescheduleForFirstJob() { queue.add(new Reminder(1, 1, 0)); - verify(jobManager).schedule(TAG, 1, true); + verify(jobManager).schedule(TAG, 1); } @Test @@ -70,7 +70,7 @@ public class JobQueueTest { queue.add(new Reminder(1, 1, 0)); queue.add(new Reminder(2, 2, 0)); - verify(jobManager).schedule(TAG, 1, true); + verify(jobManager).schedule(TAG, 1); } @Test @@ -79,8 +79,8 @@ public class JobQueueTest { queue.add(new Reminder(1, 1, 0)); InOrder order = inOrder(jobManager); - order.verify(jobManager).schedule(TAG, 2, true); - order.verify(jobManager).schedule(TAG, 1, true); + order.verify(jobManager).schedule(TAG, 2); + order.verify(jobManager).schedule(TAG, 1); } @Test @@ -89,7 +89,7 @@ public class JobQueueTest { queue.cancel(1); InOrder order = inOrder(jobManager); - order.verify(jobManager).schedule(TAG, 2, true); + order.verify(jobManager).schedule(TAG, 2); order.verify(jobManager).cancel(TAG); } @@ -101,8 +101,8 @@ public class JobQueueTest { queue.cancel(1); InOrder order = inOrder(jobManager); - order.verify(jobManager).schedule(TAG, 1, true); - order.verify(jobManager).schedule(TAG, 2, true); + order.verify(jobManager).schedule(TAG, 1); + order.verify(jobManager).schedule(TAG, 2); } @Test @@ -112,7 +112,7 @@ public class JobQueueTest { queue.cancel(2); - verify(jobManager).schedule(TAG, 1, true); + verify(jobManager).schedule(TAG, 1); } @Test @@ -127,7 +127,7 @@ public class JobQueueTest { when(preferences.adjustForQuietHours(anyLong())).thenReturn(1234L); queue.add(new Reminder(1, 1, 1)); - verify(jobManager).schedule(TAG, 1234, true); + verify(jobManager).schedule(TAG, 1234); } @Test @@ -137,7 +137,7 @@ public class JobQueueTest { queue.add(new Reminder(1, now, TYPE_DUE)); queue.add(new Reminder(2, now + ONE_MINUTE, TYPE_DUE)); - verify(jobManager).schedule(TAG, now, true); + verify(jobManager).schedule(TAG, now); Freeze.freezeAt(now).thawAfter(new Snippet() {{ assertEquals( @@ -153,7 +153,7 @@ public class JobQueueTest { queue.add(new Reminder(1, now, TYPE_DUE)); queue.add(new Reminder(2, now + ONE_MINUTE, TYPE_DUE)); - verify(jobManager).schedule(TAG, now, true); + verify(jobManager).schedule(TAG, now); Freeze.freezeAt(now).thawAfter(new Snippet() {{ queue.removeOverdueJobs(); @@ -171,7 +171,7 @@ public class JobQueueTest { queue.clear(); InOrder order = inOrder(jobManager); - order.verify(jobManager).schedule(TAG, 1, true); + order.verify(jobManager).schedule(TAG, 1); order.verify(jobManager).cancel(TAG); assertEquals(0, queue.size()); } @@ -183,6 +183,6 @@ public class JobQueueTest { queue.add(new Reminder(1, now, TYPE_DUE)); queue.cancel(2); - verify(jobManager).schedule(TAG, now, true); + verify(jobManager).schedule(TAG, now); } } diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index a1a48f8e7..eea9cb8d1 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -94,7 +94,6 @@ android:label="@string/app_name" android:theme="@style/Tasks" android:allowBackup="true" - android:fullBackupContent="@xml/backup_config" android:name=".Tasks" android:supportsRtl="true" android:manageSpaceActivity="com.todoroo.astrid.core.OldTaskPreferences"> @@ -446,6 +445,21 @@ + + + + + PendingIntent getPendingIntent(Class c) { + return PendingIntent.getService(context, 0, new Intent(context, c), 0); } } diff --git a/src/main/java/org/tasks/jobs/JobQueue.java b/src/main/java/org/tasks/jobs/JobQueue.java index b176a992b..fc8366acb 100644 --- a/src/main/java/org/tasks/jobs/JobQueue.java +++ b/src/main/java/org/tasks/jobs/JobQueue.java @@ -79,7 +79,7 @@ public class JobQueue { jobManager.cancel(tag); } } else { - jobManager.schedule(tag, nextScheduledTime(), cancelCurrent); + jobManager.schedule(tag, nextScheduledTime()); } } diff --git a/src/main/java/org/tasks/jobs/MidnightJob.java b/src/main/java/org/tasks/jobs/MidnightJob.java new file mode 100644 index 000000000..78d82071c --- /dev/null +++ b/src/main/java/org/tasks/jobs/MidnightJob.java @@ -0,0 +1,7 @@ +package org.tasks.jobs; + +public abstract class MidnightJob extends Job { + public MidnightJob(String name) { + super(name); + } +} diff --git a/src/main/java/org/tasks/jobs/MidnightRefreshJob.java b/src/main/java/org/tasks/jobs/MidnightRefreshJob.java index dd3d70dba..f5551b2a0 100644 --- a/src/main/java/org/tasks/jobs/MidnightRefreshJob.java +++ b/src/main/java/org/tasks/jobs/MidnightRefreshJob.java @@ -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; + +import javax.inject.Inject; -public class MidnightRefreshJob extends Job { +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() { + super(MidnightRefreshJob.class.getSimpleName()); + } - public MidnightRefreshJob(Broadcaster broadcaster, JobManager jobManager) { - this.broadcaster = broadcaster; - this.jobManager = jobManager; + @Override + protected void run() { + broadcaster.refresh(); + } + + @Override + protected void scheduleNext() { + jobManager.scheduleMidnightRefresh(); } - @NonNull @Override - protected Result onRunJob(Params params) { - try { - broadcaster.refresh(); - return Result.SUCCESS; - } finally { - jobManager.scheduleMidnightRefresh(false); - } + protected void inject(IntentServiceComponent component) { + component.inject(this); } } diff --git a/src/main/java/org/tasks/jobs/RefreshJob.java b/src/main/java/org/tasks/jobs/RefreshJob.java index 441bca066..d4b07091e 100644 --- a/src/main/java/org/tasks/jobs/RefreshJob.java +++ b/src/main/java/org/tasks/jobs/RefreshJob.java @@ -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); + } + + @Override + protected void run() { + broadcaster.refresh(); } - @NonNull @Override - protected Result onRunJob(Params params) { - try { - broadcaster.refresh(); - return Result.SUCCESS; - } finally { - refreshScheduler.scheduleNext(); - } + protected void scheduleNext() { + refreshScheduler.scheduleNext(); } } diff --git a/src/main/java/org/tasks/jobs/ReminderJob.java b/src/main/java/org/tasks/jobs/ReminderJob.java index 2e8098a1c..34ae6419f 100644 --- a/src/main/java/org/tasks/jobs/ReminderJob.java +++ b/src/main/java/org/tasks/jobs/ReminderJob.java @@ -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() { + super(ReminderJob.class.getSimpleName()); + } - public ReminderJob(Preferences preferences, ReminderService reminderService, Notifier notifier) { - this.preferences = preferences; - this.reminderService = reminderService; - this.notifier = notifier; + @Override + protected void inject(IntentServiceComponent component) { + component.inject(this); } - @NonNull @Override - protected Result onRunJob(Params params) { - try { - if (!preferences.isCurrentlyQuietHours()) { - for (Reminder reminder : reminderService.getPastReminders()) { - notifier.triggerTaskNotification(reminder.getId(), reminder.getType()); - } + 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(); + } } diff --git a/src/main/java/org/tasks/scheduling/AlarmManager.java b/src/main/java/org/tasks/scheduling/AlarmManager.java index d31e70bfa..37c855f86 100644 --- a/src/main/java/org/tasks/scheduling/AlarmManager.java +++ b/src/main/java/org/tasks/scheduling/AlarmManager.java @@ -34,4 +34,15 @@ public class AlarmManager { alarmManager.set(android.app.AlarmManager.RTC_WAKEUP, time, pendingIntent); } } + + @SuppressLint("NewApi") + public void noWakeup(long time, PendingIntent pendingIntent) { + if (atLeastMarshmallow()) { + alarmManager.setExactAndAllowWhileIdle(android.app.AlarmManager.RTC, time, pendingIntent); + } else if (atLeastKitKat()) { + alarmManager.setExact(android.app.AlarmManager.RTC, time, pendingIntent); + } else { + alarmManager.set(android.app.AlarmManager.RTC, time, pendingIntent); + } + } } diff --git a/src/main/java/org/tasks/scheduling/RefreshScheduler.java b/src/main/java/org/tasks/scheduling/RefreshScheduler.java index 36e871ef3..894de6aaa 100644 --- a/src/main/java/org/tasks/scheduling/RefreshScheduler.java +++ b/src/main/java/org/tasks/scheduling/RefreshScheduler.java @@ -4,6 +4,7 @@ import com.todoroo.astrid.data.Task; import org.tasks.injection.ApplicationScope; import org.tasks.jobs.JobManager; +import org.tasks.jobs.RefreshJob; import java.util.SortedSet; import java.util.TreeSet; @@ -27,7 +28,7 @@ public class RefreshScheduler { public void clear() { jobs.clear(); - jobManager.cancelRefreshes(); + jobManager.cancel(RefreshJob.TAG); } public void scheduleRefresh(Task task) { @@ -49,24 +50,20 @@ public class RefreshScheduler { } } - public void scheduleNext() { - scheduleNext(false); - } - private void schedule(long timestamp) { SortedSet upcoming = jobs.tailSet(currentTimeMillis()); boolean reschedule = upcoming.isEmpty() || timestamp < upcoming.first(); jobs.add(timestamp); if (reschedule) { - scheduleNext(true); + scheduleNext(); } } - private void scheduleNext(boolean cancelCurrent) { + public void scheduleNext() { long now = currentTimeMillis(); jobs.removeAll(newArrayList(jobs.headSet(now + 1))); if (!jobs.isEmpty()) { - jobManager.scheduleRefresh(jobs.first(), cancelCurrent); + jobManager.scheduleRefresh(jobs.first()); } } } diff --git a/src/main/java/org/tasks/scheduling/SchedulerIntentService.java b/src/main/java/org/tasks/scheduling/SchedulerIntentService.java index 1b8b4b4d9..e55b5671c 100644 --- a/src/main/java/org/tasks/scheduling/SchedulerIntentService.java +++ b/src/main/java/org/tasks/scheduling/SchedulerIntentService.java @@ -32,8 +32,8 @@ public class SchedulerIntentService extends InjectingIntentService { Timber.d("onHandleIntent(%s)", intent); - jobManager.scheduleMidnightBackup(true); - jobManager.scheduleMidnightRefresh(true); + jobManager.scheduleMidnightBackup(); + jobManager.scheduleMidnightRefresh(); refreshScheduler.clear(); long now = currentTimeMillis(); diff --git a/src/main/java/org/tasks/time/DateTimeUtils.java b/src/main/java/org/tasks/time/DateTimeUtils.java index bcf23bcb4..91ea5f2c5 100644 --- a/src/main/java/org/tasks/time/DateTimeUtils.java +++ b/src/main/java/org/tasks/time/DateTimeUtils.java @@ -23,6 +23,10 @@ public class DateTimeUtils { MILLIS_PROVIDER = SYSTEM_MILLIS_PROVIDER; } + public static long nextMidnight() { + return nextMidnight(currentTimeMillis()); + } + public static long nextMidnight(long timestamp) { return newDateTime(timestamp).startOfDay().plusDays(1).getMillis(); } diff --git a/src/main/res/xml/backup_config.xml b/src/main/res/xml/backup_config.xml deleted file mode 100644 index c5748f2ad..000000000 --- a/src/main/res/xml/backup_config.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file