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