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