diff --git a/.travis.yml b/.travis.yml
index ababc3604..ae5885051 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -7,7 +7,7 @@ env:
android:
components:
- android-23
- - platform-tools-23.0.1
+ - platform-tools-23.1
- build-tools-23.0.2
- extra-android-m2repository
- extra-google-m2repository
diff --git a/src/androidTest/java/com/todoroo/astrid/reminders/NotifyAtDeadlineTest.java b/src/androidTest/java/com/todoroo/astrid/reminders/NotifyAtDeadlineTest.java
index e3db01d4d..107f1a9fd 100644
--- a/src/androidTest/java/com/todoroo/astrid/reminders/NotifyAtDeadlineTest.java
+++ b/src/androidTest/java/com/todoroo/astrid/reminders/NotifyAtDeadlineTest.java
@@ -5,11 +5,9 @@ import android.test.AndroidTestCase;
import com.todoroo.astrid.data.Task;
-import org.tasks.time.DateTime;
-import org.tasks.Freeze;
-import org.tasks.R;
import org.tasks.preferences.Preferences;
import org.tasks.scheduling.AlarmManager;
+import org.tasks.time.DateTime;
import java.util.concurrent.TimeUnit;
@@ -44,15 +42,6 @@ public class NotifyAtDeadlineTest extends AndroidTestCase {
thaw();
}
- public void testScheduleReminderAtDueTime() {
- final DateTime dueDate = new DateTime(2014, 1, 24, 19, 23, 57);
- Task task = new Task() {{
- setDueDate(dueDate.getMillis());
- setReminderFlags(Task.NOTIFY_AT_DEADLINE);
- }};
- assertEquals(dueDate.getMillis(), reminderService.calculateNextDueDateReminder(task));
- }
-
public void testNoReminderWhenNoDueDate() {
Task task = new Task() {{
setReminderFlags(Task.NOTIFY_AT_DEADLINE);
@@ -62,120 +51,37 @@ public class NotifyAtDeadlineTest extends AndroidTestCase {
public void testNoReminderWhenNotifyAtDeadlineFlagNotSet() {
Task task = new Task() {{
- setDueDate(new DateTime(2014, 1, 24, 19, 23, 57).getMillis());
- }};
- assertEquals(NO_ALARM, reminderService.calculateNextDueDateReminder(task));
- }
-
- public void testDontNotifyMoreThanOncePerDay() {
- Task task = new Task() {{
- setDueDate(newDate(2014, 1, 23).getMillis());
- setReminderFlags(Task.NOTIFY_AT_DEADLINE);
- setReminderLast(new DateTime(2014, 1, 23, 17, 23, 37).getMillis());
+ setDueDate(URGENCY_SPECIFIC_DAY_TIME, new DateTime(2014, 1, 24, 19, 23).getMillis());
}};
assertEquals(NO_ALARM, reminderService.calculateNextDueDateReminder(task));
}
- public void disabled_testNotifyIfLastNotificationWasMoreThanOneDayAgo() {
- final DateTime dueDate = new DateTime(2014, 1, 24, 0, 0, 0, 0);
- Task task = new Task() {{
- setDueDate(Task.URGENCY_SPECIFIC_DAY, dueDate.getMillis());
- setReminderFlags(Task.NOTIFY_AT_DEADLINE);
- setReminderLast(new DateTime(2014, 1, 23, 17, 23, 36).getMillis());
- }};
- assertEquals(
- dueDate.withHourOfDay(18).getMillis(),
- reminderService.calculateNextDueDateReminder(task));
- }
-
- public void testDuringQuietHoursSetNotificationAtEnd() {
- setQuietHours(0, 10);
- Freeze.freezeAt(new DateTime(2014, 1, 27, 9, 13, 37, 501));
- preferences.setInt(R.string.p_rmd_time, 8 * MILLIS_PER_HOUR);
+ public void testScheduleReminderAtDueTime() {
+ final DateTime dueDate = new DateTime(2014, 1, 24, 19, 23);
Task task = new Task() {{
- setDueDate(Task.URGENCY_SPECIFIC_DAY, newDate(2014, 1, 27).getMillis());
+ setDueDate(URGENCY_SPECIFIC_DAY_TIME, dueDate.getMillis());
setReminderFlags(Task.NOTIFY_AT_DEADLINE);
}};
- assertEquals(
- new DateTime(2014, 1, 27, 10, 0, 0, 0).getMillis(),
- reminderService.calculateNextDueDateReminder(task));
+ assertEquals(dueDate.plusSeconds(1).getMillis(), reminderService.calculateNextDueDateReminder(task));
}
- public void testAfterQuietHoursSetNotificationOnePeriodCloserToDueDate() {
- setQuietHours(0, 10);
- Freeze.freezeAt(new DateTime(2014, 1, 27, 11, 13, 37, 501));
- preferences.setInt(R.string.p_rmd_time, 8 * MILLIS_PER_HOUR);
+ public void testScheduleReminderAtDefaultDueTime() {
+ final DateTime dueDate = new DateTime(2015, 12, 29, 12, 0);
Task task = new Task() {{
- setDueDate(Task.URGENCY_SPECIFIC_DAY, newDate(2014, 1, 27).getMillis());
+ setDueDate(URGENCY_SPECIFIC_DAY, dueDate.getMillis());
setReminderFlags(Task.NOTIFY_AT_DEADLINE);
}};
- assertEquals(
- new DateTime(2014, 1, 27, 11, 25, 13, 125).getMillis(),
+ assertEquals(dueDate.withHourOfDay(18).getMillis(),
reminderService.calculateNextDueDateReminder(task));
}
- public void testBeforeQuietStartDueDateMoreThanOnePeriodAfterEnd() {
- setQuietHours(2, 11);
- Freeze.freezeAt(new DateTime(2014, 1, 27, 1, 53, 37, 509));
- preferences.setInt(R.string.p_rmd_time, MILLIS_PER_HOUR);
+ public void testNoReminderIfAlreadyRemindedPastDueDate() {
+ final DateTime dueDate = new DateTime(2015, 12, 29, 19, 23);
Task task = new Task() {{
- setDueDate(Task.URGENCY_SPECIFIC_DAY, newDate(2014, 1, 27).getMillis());
+ setDueDate(URGENCY_SPECIFIC_DAY_TIME, dueDate.getMillis());
+ setReminderLast(dueDate.plusSeconds(1).getMillis());
setReminderFlags(Task.NOTIFY_AT_DEADLINE);
}};
- assertEquals(
- new DateTime(2014, 1, 27, 11, 0, 0, 0).getMillis(),
- reminderService.calculateNextDueDateReminder(task));
- }
-
- public void testBeforeQuietStartDueDateLessThanOnePeriodAfterEnd() {
- setQuietHours(3, 11);
- Freeze.freezeAt(new DateTime(2014, 1, 27, 1, 53, 37, 509));
- preferences.setInt(R.string.p_rmd_time, MILLIS_PER_HOUR);
- assertEquals(
- new DateTime(2014, 1, 27, 2, 10, 13, 131).getMillis(),
- reminderService.calculateNextDueDateReminder(dueAtNoon));
- }
-
- public void testNoAlarmAfterQuietHoursStartWithWrap() {
- setQuietHours(10, 1);
- Freeze.freezeAt(new DateTime(2014, 1, 27, 10, 0, 0, 0));
- preferences.setInt(R.string.p_rmd_time, 8 * MILLIS_PER_HOUR);
- assertEquals(
- NO_ALARM,
- reminderService.calculateNextDueDateReminder(dueAtNoon));
- }
-
- public void testSetToQuietAlarmEndWithWrap() {
- setQuietHours(22, 11);
- Freeze.freezeAt(new DateTime(2014, 1, 27, 10, 59, 59, 999));
- preferences.setInt(R.string.p_rmd_time, 8 * MILLIS_PER_HOUR);
- assertEquals(
- new DateTime(2014, 1, 27, 11, 0, 0, 0).getMillis(),
- reminderService.calculateNextDueDateReminder(dueAtNoon));
- }
-
- public void testSetReminderOnePeriodFromNowBeforeQuietHourStartWithWrap() {
- setQuietHours(22, 11);
- Freeze.freezeAt(new DateTime(2014, 1, 27, 11, 0, 0, 0));
- preferences.setInt(R.string.p_rmd_time, 8 * MILLIS_PER_HOUR);
- assertEquals(
- // wtf? this is after due date
- new DateTime(2014, 1, 27, 13, 45, 0, 0).getMillis(),
- reminderService.calculateNextDueDateReminder(dueAtNoon));
- }
-
- public void testSetReminderOnePeriodFromNowNoQuietHours() {
- Freeze.freezeAt(new DateTime(2014, 1, 27, 11, 0, 0, 0));
- preferences.setBoolean(R.string.p_rmd_enable_quiet, false);
- preferences.setInt(R.string.p_rmd_time, 8 * MILLIS_PER_HOUR);
- assertEquals(
- new DateTime(2014, 1, 27, 11, 15, 0, 0).getMillis(),
- reminderService.calculateNextDueDateReminder(dueAtNoon));
- }
-
- private void setQuietHours(int start, int end) {
- preferences.setBoolean(R.string.p_rmd_enable_quiet, true);
- preferences.setInt(R.string.p_rmd_quietStart, start * MILLIS_PER_HOUR);
- preferences.setInt(R.string.p_rmd_quietEnd, end * MILLIS_PER_HOUR);
+ assertEquals(NO_ALARM, reminderService.calculateNextDueDateReminder(task));
}
}
diff --git a/src/androidTest/java/org/tasks/NotifierTests.java b/src/androidTest/java/org/tasks/NotifierTests.java
deleted file mode 100644
index cb2c8a1c1..000000000
--- a/src/androidTest/java/org/tasks/NotifierTests.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package org.tasks;
-
-import android.annotation.SuppressLint;
-import android.test.AndroidTestCase;
-
-import org.tasks.time.DateTime;
-import org.tasks.preferences.Preferences;
-
-import java.util.concurrent.TimeUnit;
-
-import static org.tasks.Notifier.isQuietHours;
-import static org.tasks.Freeze.freezeAt;
-import static org.tasks.Freeze.thaw;
-
-public class NotifierTests extends AndroidTestCase {
-
- @SuppressLint("NewApi")
- private static final int MILLIS_PER_HOUR = (int) TimeUnit.HOURS.toMillis(1);
-
- private static final DateTime now = new DateTime(2014, 1, 23, 18, 8, 31, 540);
-
- private Preferences preferences;
-
- @Override
- public void setUp() {
- preferences = new Preferences(getContext(), null, null);
- preferences.clear();
- preferences.setBoolean(R.string.p_rmd_enable_quiet, true);
- freezeAt(now);
- }
-
- @Override
- public void tearDown() {
- thaw();
- }
-
- public void testNotQuietWhenQuietHoursDisabled() {
- preferences.setBoolean(R.string.p_rmd_enable_quiet, false);
- setQuietHoursStart(18);
- setQuietHoursEnd(19);
-
- assertFalse(isQuietHours(preferences));
- }
-
- public void testIsQuietAtStartOfQuietHoursNoTimeWrap() {
- setQuietHoursStart(18);
- setQuietHoursEnd(19);
-
- assertTrue(isQuietHours(preferences));
- }
-
- public void testIsNotQuietWhenStartAndEndAreSame() {
- setQuietHoursStart(18);
- setQuietHoursEnd(18);
-
- assertFalse(isQuietHours(preferences));
- }
-
- public void testIsNotQuietAtEndOfQuietHoursNoTimeWrap() {
- setQuietHoursStart(17);
- setQuietHoursEnd(18);
-
- assertFalse(isQuietHours(preferences));
- }
-
- public void testIsQuietAtStartOfQuietHoursTimeWrap() {
- setQuietHoursStart(18);
- setQuietHoursEnd(9);
-
- assertTrue(isQuietHours(preferences));
- }
-
- public void testIsNotQuietAtEndOfQuietHoursTimeWrap() {
- setQuietHoursStart(19);
- setQuietHoursEnd(18);
-
- assertFalse(isQuietHours(preferences));
- }
-
- private void setQuietHoursStart(int hour) {
- preferences.setInt(R.string.p_rmd_quietStart, hour * MILLIS_PER_HOUR);
- }
-
- private void setQuietHoursEnd(int hour) {
- preferences.setInt(R.string.p_rmd_quietEnd, hour * MILLIS_PER_HOUR);
- }
-}
diff --git a/src/androidTest/java/org/tasks/scheduling/AlarmManagerTests.java b/src/androidTest/java/org/tasks/scheduling/AlarmManagerTests.java
new file mode 100644
index 000000000..eafc92b9d
--- /dev/null
+++ b/src/androidTest/java/org/tasks/scheduling/AlarmManagerTests.java
@@ -0,0 +1,139 @@
+package org.tasks.scheduling;
+
+import android.annotation.SuppressLint;
+import android.test.AndroidTestCase;
+
+import org.tasks.R;
+import org.tasks.preferences.Preferences;
+import org.tasks.time.DateTime;
+
+import java.util.concurrent.TimeUnit;
+
+public class AlarmManagerTests extends AndroidTestCase {
+
+ @SuppressLint("NewApi")
+ private static final int MILLIS_PER_HOUR = (int) TimeUnit.HOURS.toMillis(1);
+
+ private Preferences preferences;
+ private AlarmManager alarmManager;
+
+ @Override
+ public void setUp() {
+ preferences = new Preferences(getContext(), null, null);
+ preferences.clear();
+ preferences.setBoolean(R.string.p_rmd_enable_quiet, true);
+ alarmManager = new AlarmManager(getContext(), preferences);
+ }
+
+ public void testNotQuietWhenQuietHoursDisabled() {
+ preferences.setBoolean(R.string.p_rmd_enable_quiet, false);
+ setQuietHoursStart(22);
+ setQuietHoursEnd(10);
+
+ long dueDate = new DateTime(2015, 12, 29, 8, 0, 1).getMillis();
+
+ assertEquals(dueDate, alarmManager.adjustForQuietHours(dueDate));
+ }
+
+ public void testIsQuietAtStartOfQuietHoursNoWrap() {
+ setQuietHoursStart(18);
+ setQuietHoursEnd(19);
+
+ long dueDate = new DateTime(2015, 12, 29, 18, 0, 1).getMillis();
+
+ assertEquals(new DateTime(2015, 12, 29, 19, 0).getMillis(),
+ alarmManager.adjustForQuietHours(dueDate));
+ }
+
+ public void testIsQuietAtStartOfQuietHoursWrap() {
+ setQuietHoursStart(22);
+ setQuietHoursEnd(10);
+
+ long dueDate = new DateTime(2015, 12, 29, 22, 0, 1).getMillis();
+
+ assertEquals(new DateTime(2015, 12, 30, 10, 0).getMillis(),
+ alarmManager.adjustForQuietHours(dueDate));
+ }
+
+ public void testAdjustForQuietHoursNightWrap() {
+ setQuietHoursStart(22);
+ setQuietHoursEnd(10);
+
+ long dueDate = new DateTime(2015, 12, 29, 23, 30).getMillis();
+
+ assertEquals(new DateTime(2015, 12, 30, 10, 0).getMillis(),
+ alarmManager.adjustForQuietHours(dueDate));
+ }
+
+ public void testAdjustForQuietHoursMorningWrap() {
+ setQuietHoursStart(22);
+ setQuietHoursEnd(10);
+
+ long dueDate = new DateTime(2015, 12, 30, 7, 15).getMillis();
+
+ assertEquals(new DateTime(2015, 12, 30, 10, 0).getMillis(),
+ alarmManager.adjustForQuietHours(dueDate));
+ }
+
+ public void testAdjustForQuietHoursWhenStartAndEndAreSame() {
+ setQuietHoursStart(18);
+ setQuietHoursEnd(18);
+
+ long dueDate = new DateTime(2015, 12, 29, 18, 0, 0).getMillis();
+
+ assertEquals(dueDate, alarmManager.adjustForQuietHours(dueDate));
+ }
+
+ public void testIsNotQuietAtEndOfQuietHoursNoWrap() {
+ setQuietHoursStart(17);
+ setQuietHoursEnd(18);
+
+ long dueDate = new DateTime(2015, 12, 29, 18, 0).getMillis();
+
+ assertEquals(dueDate, alarmManager.adjustForQuietHours(dueDate));
+ }
+
+ public void testIsNotQuietAtEndOfQuietHoursWrap() {
+ setQuietHoursStart(22);
+ setQuietHoursEnd(10);
+
+ long dueDate = new DateTime(2015, 12, 29, 10, 0).getMillis();
+
+ assertEquals(dueDate, alarmManager.adjustForQuietHours(dueDate));
+ }
+
+ public void testIsNotQuietBeforeNoWrap() {
+ setQuietHoursStart(17);
+ setQuietHoursEnd(18);
+
+ long dueDate = new DateTime(2015, 12, 29, 11, 30).getMillis();
+
+ assertEquals(dueDate, alarmManager.adjustForQuietHours(dueDate));
+ }
+
+ public void testIsNotQuietAfterNoWrap() {
+ setQuietHoursStart(17);
+ setQuietHoursEnd(18);
+
+ long dueDate = new DateTime(2015, 12, 29, 22, 15).getMillis();
+
+ assertEquals(dueDate, alarmManager.adjustForQuietHours(dueDate));
+ }
+
+ public void testIsNotQuietWrap() {
+ setQuietHoursStart(22);
+ setQuietHoursEnd(10);
+
+ long dueDate = new DateTime(2015, 12, 29, 13, 45).getMillis();
+
+ assertEquals(dueDate, alarmManager.adjustForQuietHours(dueDate));
+ }
+
+ private void setQuietHoursStart(int hour) {
+ preferences.setInt(R.string.p_rmd_quietStart, hour * MILLIS_PER_HOUR);
+ }
+
+ private void setQuietHoursEnd(int hour) {
+ preferences.setInt(R.string.p_rmd_quietEnd, hour * MILLIS_PER_HOUR);
+ }
+}
diff --git a/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksMetadataServiceTest.java b/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksMetadataServiceTest.java
index d48d34fe7..a379bc385 100644
--- a/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksMetadataServiceTest.java
+++ b/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksMetadataServiceTest.java
@@ -29,7 +29,7 @@ public class GtasksMetadataServiceTest extends DatabaseTestCase {
private final GtasksTestPreferenceService service;
public GtasksMetadataServiceTestModule(Context context) {
- service = new GtasksTestPreferenceService(context, new Preferences(context, null, null));
+ service = new GtasksTestPreferenceService(context, new Preferences(context, null, null), null);
}
@Provides
diff --git a/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksTestPreferenceService.java b/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksTestPreferenceService.java
index 3118dd871..c1eaa7f94 100644
--- a/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksTestPreferenceService.java
+++ b/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksTestPreferenceService.java
@@ -7,12 +7,13 @@ package com.todoroo.astrid.gtasks;
import android.content.Context;
+import org.tasks.preferences.PermissionChecker;
import org.tasks.preferences.Preferences;
public class GtasksTestPreferenceService extends GtasksPreferenceService {
- public GtasksTestPreferenceService(Context context, Preferences preferences) {
- super(context, preferences);
+ public GtasksTestPreferenceService(Context context, Preferences preferences, PermissionChecker permissionChecker) {
+ super(context, preferences, permissionChecker);
}
@Override
diff --git a/src/main/java/com/todoroo/astrid/alarms/AlarmService.java b/src/main/java/com/todoroo/astrid/alarms/AlarmService.java
index 414995f11..71578f210 100644
--- a/src/main/java/com/todoroo/astrid/alarms/AlarmService.java
+++ b/src/main/java/com/todoroo/astrid/alarms/AlarmService.java
@@ -155,7 +155,7 @@ public class AlarmService {
if(time == 0 || time == NO_ALARM) {
alarmManager.cancel(pendingIntent);
} else if(time > DateUtilities.now()) {
- alarmManager.wakeup(time, pendingIntent);
+ alarmManager.wakeupAdjustingForQuietHours(time, pendingIntent);
}
}
diff --git a/src/main/java/com/todoroo/astrid/reminders/ReminderService.java b/src/main/java/com/todoroo/astrid/reminders/ReminderService.java
index d0606fd06..a3c0b2c43 100644
--- a/src/main/java/com/todoroo/astrid/reminders/ReminderService.java
+++ b/src/main/java/com/todoroo/astrid/reminders/ReminderService.java
@@ -18,12 +18,12 @@ import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
import com.todoroo.astrid.data.Task;
-import org.tasks.time.DateTime;
import org.tasks.R;
import org.tasks.injection.ForApplication;
import org.tasks.preferences.Preferences;
import org.tasks.receivers.TaskNotificationReceiver;
import org.tasks.scheduling.AlarmManager;
+import org.tasks.time.DateTime;
import java.util.Random;
@@ -32,7 +32,6 @@ import javax.inject.Singleton;
import timber.log.Timber;
-import static org.tasks.time.DateTimeUtils.currentTimeMillis;
import static org.tasks.date.DateTimeUtils.newDateTime;
/**
@@ -185,17 +184,13 @@ public final class ReminderService {
// snooze trumps all
if(whenSnooze != NO_ALARM) {
scheduler.createAlarm(context, task, whenSnooze, TYPE_SNOOZE);
- }
- else if(whenRandom < whenDueDate && whenRandom < whenOverdue) {
+ } else if(whenRandom < whenDueDate && whenRandom < whenOverdue) {
scheduler.createAlarm(context, task, whenRandom, TYPE_RANDOM);
- }
- else if(whenDueDate < whenOverdue) {
+ } else if(whenDueDate < whenOverdue) {
scheduler.createAlarm(context, task, whenDueDate, TYPE_DUE);
- }
- else if(whenOverdue != NO_ALARM) {
+ } else if(whenOverdue != NO_ALARM) {
scheduler.createAlarm(context, task, whenOverdue, TYPE_OVERDUE);
- }
- else {
+ } else {
scheduler.createAlarm(context, task, 0, 0);
}
}
@@ -263,89 +258,21 @@ public final class ReminderService {
* preferences and assign a time.
*/
long calculateNextDueDateReminder(Task task) {
- // Uses getNowValue() instead of DateUtilities.now()
if(task.hasDueDate() && task.isNotifyAtDeadline()) {
long dueDate = task.getDueDate();
long lastReminder = task.getReminderLast();
- long dueDateAlarm = NO_ALARM;
+ long dueDateAlarm;
- if(task.hasDueTime()) {
+ if (task.hasDueTime()) {
dueDateAlarm = dueDate;
- } else if (DateUtilities.now() > lastReminder + DateUtilities.ONE_DAY) {
- // return notification time on this day
- DateTime date = new DateTime(dueDate).withMillisOfDay(preferences.getInt(R.string.p_rmd_time, 18 * MILLIS_PER_HOUR));
- dueDateAlarm = date.getMillis();
- if (dueDate > getNowValue() && dueDateAlarm < getNowValue()) {
- // this only happens for tasks due today, cause dueDateAlarm wouldn't be in the past otherwise
- // if the default reminder is in the past, then reschedule it
- // on this day before start of quiet hours or after quiet hours
- // randomly placed in this interval
- long quietHoursStart = new DateTime().withMillisOfDay(preferences.getInt(R.string.p_rmd_quietStart, 22 * MILLIS_PER_HOUR)).getMillis();
- DateTime quietHoursStartDate = newDateTime(quietHoursStart);
-
- long quietHoursEnd = new DateTime().withMillisOfDay(preferences.getInt(R.string.p_rmd_quietEnd, 10 * MILLIS_PER_HOUR)).getMillis();
- DateTime quietHoursEndDate = newDateTime(quietHoursEnd);
-
- boolean quietHoursEnabled = preferences.quietHoursEnabled();
-
- long millisToQuiet;
- long millisToEndOfDay = dueDate - getNowValue();
-
- int periodDivFactor = 4;
-
- if(quietHoursEnabled) {
- long now = currentTimeMillis();
- if(quietHoursStart <= quietHoursEnd) {
- if(now >= quietHoursStart && now < quietHoursEnd) {
- // its quiet now, quietHoursEnd is 23 max,
- // so put the default reminder to the end of the quiethours
- date = quietHoursEndDate;
- dueDateAlarm = date.getMillis();
- } else if (now < quietHoursStart) {
- // quietHours didnt start yet
- millisToQuiet = quietHoursStartDate.getMillis() - getNowValue();
- long millisAfterQuiet = dueDate - quietHoursEndDate.getMillis();
-
- // if there is more time after quiethours today, select quiethours-end for reminder
- if (millisAfterQuiet > (millisToQuiet / ((float)(1-(1/periodDivFactor))) )) {
- dueDateAlarm = quietHoursEndDate.getMillis();
- } else {
- dueDateAlarm = getNowValue() + (millisToQuiet / periodDivFactor);
- }
- } else {
- // after quietHours, reuse dueDate for end of day
- dueDateAlarm = getNowValue() + (millisToEndOfDay / periodDivFactor);
- }
- } else { // wrap across 24/hour boundary
- if(now >= quietHoursStart) {
- // do nothing for the end of day, dont let it even vibrate
- dueDateAlarm = NO_ALARM;
- } else if (now < quietHoursEnd) {
- date = quietHoursEndDate;
- dueDateAlarm = date.getMillis();
- } else {
- // quietHours didnt start yet
- millisToQuiet = quietHoursStartDate.getMillis() - getNowValue();
- dueDateAlarm = getNowValue() + (millisToQuiet / periodDivFactor);
- }
- }
- } else {
- // Quiet hours not activated, simply schedule the reminder on 1/periodDivFactor towards the end of day
- dueDateAlarm = getNowValue() + (millisToEndOfDay / periodDivFactor);
- }
-
- if(dueDate > getNowValue() && dueDateAlarm < getNowValue()) {
- dueDateAlarm = dueDate;
- }
- }
- }
-
- if(lastReminder > dueDateAlarm) {
- return NO_ALARM;
+ } else {
+ dueDateAlarm = new DateTime(dueDate)
+ .withMillisOfDay(preferences.getInt(R.string.p_rmd_time, 18 * MILLIS_PER_HOUR))
+ .getMillis();
}
- return dueDateAlarm;
+ return lastReminder < dueDateAlarm ? dueDateAlarm : NO_ALARM;
}
return NO_ALARM;
}
@@ -436,7 +363,7 @@ public final class ReminderService {
time = DateUtilities.now() + 5000L;
}
- alarmManager.wakeup(time, pendingIntent);
+ alarmManager.wakeupAdjustingForQuietHours(time, pendingIntent);
}
}
}
diff --git a/src/main/java/org/tasks/Notifier.java b/src/main/java/org/tasks/Notifier.java
index da431ddb6..8142c4526 100644
--- a/src/main/java/org/tasks/Notifier.java
+++ b/src/main/java/org/tasks/Notifier.java
@@ -34,7 +34,6 @@ import org.tasks.receivers.CompleteTaskReceiver;
import org.tasks.reminders.MissedCallActivity;
import org.tasks.reminders.NotificationActivity;
import org.tasks.reminders.SnoozeActivity;
-import org.tasks.time.DateTime;
import java.io.InputStream;
@@ -322,7 +321,7 @@ public class Notifier {
boolean soundIntervalOk = checkLastNotificationSound();
- if (!isQuietHours(preferences) && telephonyManager.callStateIdle()) {
+ if (telephonyManager.callStateIdle()) {
String notificationPreference = preferences.getStringValue(R.string.p_rmd_ringtone);
if (audioManager.notificationsMuted()) {
notification.sound = null;
@@ -344,7 +343,7 @@ public class Notifier {
notification.vibrate = null;
}
- if (isQuietHours(preferences) || !telephonyManager.callStateIdle()) {
+ if (!telephonyManager.callStateIdle()) {
notification.sound = null;
notification.vibrate = null;
voiceReminder = false;
@@ -389,26 +388,4 @@ public class Notifier {
}
return false;
}
-
- /**
- * @return whether we're in quiet hours
- */
- static boolean isQuietHours(Preferences preferences) {
- boolean quietHoursEnabled = preferences.quietHoursEnabled();
- if (quietHoursEnabled) {
- long quietHoursStart = new DateTime().withMillisOfDay(preferences.getInt(R.string.p_rmd_quietStart)).getMillis();
- long quietHoursEnd = new DateTime().withMillisOfDay(preferences.getInt(R.string.p_rmd_quietEnd)).getMillis();
- long now = currentTimeMillis();
- if (quietHoursStart <= quietHoursEnd) {
- if (now >= quietHoursStart && now < quietHoursEnd) {
- return true;
- }
- } else { // wrap across 24/hour boundary
- if (now >= quietHoursStart || now < quietHoursEnd) {
- return true;
- }
- }
- }
- return false;
- }
}
diff --git a/src/main/java/org/tasks/scheduling/AlarmManager.java b/src/main/java/org/tasks/scheduling/AlarmManager.java
index 2f5a6aceb..8eabec566 100644
--- a/src/main/java/org/tasks/scheduling/AlarmManager.java
+++ b/src/main/java/org/tasks/scheduling/AlarmManager.java
@@ -6,6 +6,7 @@ import android.content.Context;
import org.tasks.R;
import org.tasks.injection.ForApplication;
import org.tasks.preferences.Preferences;
+import org.tasks.time.DateTime;
import javax.inject.Inject;
@@ -26,6 +27,10 @@ public class AlarmManager {
alarmManager.cancel(pendingIntent);
}
+ public void wakeupAdjustingForQuietHours(long time, PendingIntent pendingIntent) {
+ wakeup(adjustForQuietHours(time), pendingIntent);
+ }
+
public void wakeup(long time, PendingIntent pendingIntent) {
if (preferences.isDozeNotificationEnabled()) {
alarmManager.setExactAndAllowWhileIdle(android.app.AlarmManager.RTC_WAKEUP, time, pendingIntent);
@@ -49,4 +54,24 @@ public class AlarmManager {
public void setInexactRepeating(long interval, PendingIntent pendingIntent) {
alarmManager.setInexactRepeating(android.app.AlarmManager.RTC, 0, interval, pendingIntent);
}
+
+ long adjustForQuietHours(long time) {
+ if (preferences.quietHoursEnabled()) {
+ DateTime dateTime = new DateTime(time);
+ DateTime start = dateTime.withMillisOfDay(preferences.getInt(R.string.p_rmd_quietStart));
+ DateTime end = dateTime.withMillisOfDay(preferences.getInt(R.string.p_rmd_quietEnd));
+ if (start.isAfter(end)) {
+ if (dateTime.isBefore(end)) {
+ return end.getMillis();
+ } else if (dateTime.isAfter(start)) {
+ return end.plusDays(1).getMillis();
+ }
+ } else {
+ if (dateTime.isAfter(start) && dateTime.isBefore(end)) {
+ return end.getMillis();
+ }
+ }
+ }
+ return time;
+ }
}
diff --git a/src/main/java/org/tasks/scheduling/RecurringIntervalIntentService.java b/src/main/java/org/tasks/scheduling/RecurringIntervalIntentService.java
index 9b84b0ef3..9981c45f0 100644
--- a/src/main/java/org/tasks/scheduling/RecurringIntervalIntentService.java
+++ b/src/main/java/org/tasks/scheduling/RecurringIntervalIntentService.java
@@ -53,7 +53,7 @@ public abstract class RecurringIntervalIntentService extends InjectingIntentServ
}
PendingIntent pendingIntent = PendingIntent.getService(this, 0, new Intent(this, this.getClass()), PendingIntent.FLAG_UPDATE_CURRENT);
- alarmManager.noWakeup(nextRun, pendingIntent);
+ alarmManager.wakeup(nextRun, pendingIntent);
}
abstract void run();
diff --git a/src/main/java/org/tasks/time/DateTime.java b/src/main/java/org/tasks/time/DateTime.java
index 2b6ac1178..787f373fe 100644
--- a/src/main/java/org/tasks/time/DateTime.java
+++ b/src/main/java/org/tasks/time/DateTime.java
@@ -17,6 +17,10 @@ public class DateTime {
private final TimeZone timeZone;
private final long timestamp;
+ public DateTime(int year, int month, int day, int hour, int minute) {
+ this(year, month, day, hour, minute, 0, 0);
+ }
+
public DateTime(int year, int month, int day, int hour, int minute, int second) {
this(year, month, day, hour, minute, second, 0);
}
@@ -171,6 +175,10 @@ public class DateTime {
return add(Calendar.MINUTE, minutes);
}
+ public DateTime plusSeconds(int seconds) {
+ return add(Calendar.SECOND, seconds);
+ }
+
public DateTime minusDays(int days) {
return subtract(Calendar.DATE, days);
}
diff --git a/src/main/res/values-bg-rBG/strings.xml b/src/main/res/values-bg-rBG/strings.xml
index b6683975c..0c75213fb 100644
--- a/src/main/res/values-bg-rBG/strings.xml
+++ b/src/main/res/values-bg-rBG/strings.xml
@@ -351,7 +351,6 @@
Помощ & Обратна връзка
Свържи се с разработчика
Гласувайте за Tasks
- Без звук или вибрации по време на тихи часове
Дарете
Грешка
Изберете размер
diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml
index d3bd59502..0f91ff104 100644
--- a/src/main/res/values-de/strings.xml
+++ b/src/main/res/values-de/strings.xml
@@ -330,7 +330,6 @@
Hilfe & Feedback
Entwickler kontaktieren
Bewerte Tasks
- Kein Ton oder Vibration während der Ruhezeiten
Spenden
Fehler
Menge auswählen
diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml
index 856d2e4b2..90aa9b1e7 100644
--- a/src/main/res/values-es/strings.xml
+++ b/src/main/res/values-es/strings.xml
@@ -343,7 +343,6 @@
Ayuda y valoraciones
Contactar al desarrollador
Calificar a Tasks
- Sin sonido ni vibración durante el horario de silencio
Donar
Elegir cantidad
Acciones de notificación
diff --git a/src/main/res/values-fa/strings.xml b/src/main/res/values-fa/strings.xml
index dd2e2a71f..92f542ee3 100644
--- a/src/main/res/values-fa/strings.xml
+++ b/src/main/res/values-fa/strings.xml
@@ -253,7 +253,6 @@
کمک و بازخورد
تماس با توسعه دهنده
ارزیابی وظیفه
- خاموش کردن صدا و ویبره هنگام ساعات سکوت
کمک مالی
خطا
انتخاب مقدار
diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml
index 03d1bc4c7..400afa400 100644
--- a/src/main/res/values-fr/strings.xml
+++ b/src/main/res/values-fr/strings.xml
@@ -333,7 +333,6 @@
Aide et retours
Contacter le développeur
Noter Tasks
- Ni sonnerie ni vibreur pendant les heures de repos
Remercier
Erreur
Choisir le montant
diff --git a/src/main/res/values-it/strings.xml b/src/main/res/values-it/strings.xml
index 77a32ab49..75abf3e27 100644
--- a/src/main/res/values-it/strings.xml
+++ b/src/main/res/values-it/strings.xml
@@ -345,7 +345,6 @@ Se visualizzi questo errore più volte, ti consigliamo di cancellare tutti i dat
Aiuto & Suggerimenti
Contatta lo sviluppatore
Attività
- Durante le ore di quiete né audio né vibrazione
Dona
Errore
Seleziona quantità
diff --git a/src/main/res/values-ja/strings.xml b/src/main/res/values-ja/strings.xml
index 48f472ef4..4ad7de63c 100644
--- a/src/main/res/values-ja/strings.xml
+++ b/src/main/res/values-ja/strings.xml
@@ -350,7 +350,6 @@
ヘルプ & フィードバック
開発者に連絡
Tasks を評価
- 消音時間の間はサウンドも振動も行いません
寄付
エラー
金額を選択
diff --git a/src/main/res/values-ko/strings.xml b/src/main/res/values-ko/strings.xml
index 17c182c1d..f75cd462d 100644
--- a/src/main/res/values-ko/strings.xml
+++ b/src/main/res/values-ko/strings.xml
@@ -352,7 +352,6 @@ Tasks의 백업에서 당신의 일정을 복구하시기 바랍니다.
도움말 & 피드백
개발자와 연락
Tasks 평가하기
- 무음 시간대에는 소리나 진동 해제
기부하기
오류
숫자 선택
diff --git a/src/main/res/values-nl/strings.xml b/src/main/res/values-nl/strings.xml
index 45b25a37b..42882ad1f 100644
--- a/src/main/res/values-nl/strings.xml
+++ b/src/main/res/values-nl/strings.xml
@@ -344,7 +344,6 @@
Help & Terugkoppeling
Contact ontwikkelaar
Beoordeel Taken
- Geen geluid of trillen tijdens stillen uren
Doneer
Fout
Selecteer aantal
diff --git a/src/main/res/values-pt/strings.xml b/src/main/res/values-pt/strings.xml
index 3c241d3a0..d564f70e7 100644
--- a/src/main/res/values-pt/strings.xml
+++ b/src/main/res/values-pt/strings.xml
@@ -342,7 +342,6 @@ das tarefas através de um backup em Definições->Sincronização e backup-&
Ajuda e comentários
Contacte o programador
Avaliar o Tasks
- Sem som nem vibração nas horas de silêncio
Donativos
Erro
Selecione o valor
diff --git a/src/main/res/values-ru/strings.xml b/src/main/res/values-ru/strings.xml
index 29c5f0d8b..f472a3aa6 100644
--- a/src/main/res/values-ru/strings.xml
+++ b/src/main/res/values-ru/strings.xml
@@ -349,7 +349,6 @@
Помощь и обратная связь
Связь с разработчиком
Оставить отзыв
- Выкл. звук или вибрацию в тихие часы
Поддержать автора ($)
Ошибка
Выберите количество
diff --git a/src/main/res/values-sk/strings.xml b/src/main/res/values-sk/strings.xml
index 5c0231e78..681692598 100644
--- a/src/main/res/values-sk/strings.xml
+++ b/src/main/res/values-sk/strings.xml
@@ -334,7 +334,6 @@
Pomoc a spätná väzba
Kontaktovať vývojára
Ohodnotiť Tasks
- Žiadne zvonenie alebo vibrovanie počas tichých hodín
Darovať
Chyba
Vybrať sumu
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index 27ea105da..b914a9844 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -77,7 +77,7 @@
Help & Feedback
Contact developer
Rate Tasks
- No sound or vibration during quiet hours
+ No reminders during quiet hours
Donate
Error
Select amount