No notifications during quiet hours

Closes #138
pull/384/head
Alex Baker 10 years ago
parent 9472c796db
commit 4a3d74dcfb

@ -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

@ -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));
}
}

@ -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);
}
}

@ -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);
}
}

@ -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

@ -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

@ -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);
}
}

@ -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()) {
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;
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);
}
}
}

@ -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;
}
}

@ -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;
}
}

@ -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();

@ -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);
}

@ -351,7 +351,6 @@
<string name="help_and_feedback">Помощ &amp; Обратна връзка</string>
<string name="contact_developer">Свържи се с разработчика</string>
<string name="rate_tasks">Гласувайте за Tasks</string>
<string name="quiet_hours_summary">Без звук или вибрации по време на тихи часове</string>
<string name="TLA_menu_donate">Дарете</string>
<string name="error">Грешка</string>
<string name="select_amount">Изберете размер</string>

@ -330,7 +330,6 @@
<string name="help_and_feedback">Hilfe &amp; Feedback</string>
<string name="contact_developer">Entwickler kontaktieren</string>
<string name="rate_tasks">Bewerte Tasks</string>
<string name="quiet_hours_summary">Kein Ton oder Vibration während der Ruhezeiten</string>
<string name="TLA_menu_donate">Spenden</string>
<string name="error">Fehler</string>
<string name="select_amount">Menge auswählen</string>

@ -343,7 +343,6 @@
<string name="help_and_feedback">Ayuda y valoraciones</string>
<string name="contact_developer">Contactar al desarrollador</string>
<string name="rate_tasks">Calificar a Tasks</string>
<string name="quiet_hours_summary">Sin sonido ni vibración durante el horario de silencio</string>
<string name="TLA_menu_donate">Donar</string>
<string name="select_amount">Elegir cantidad</string>
<string name="notification_actions">Acciones de notificación</string>

@ -253,7 +253,6 @@
<string name="help_and_feedback">کمک و بازخورد</string>
<string name="contact_developer">تماس با توسعه دهنده</string>
<string name="rate_tasks">ارزیابی وظیفه</string>
<string name="quiet_hours_summary">خاموش کردن صدا و ویبره هنگام ساعات سکوت</string>
<string name="TLA_menu_donate">کمک مالی</string>
<string name="error">خطا</string>
<string name="select_amount">انتخاب مقدار</string>

@ -333,7 +333,6 @@
<string name="help_and_feedback">Aide et retours</string>
<string name="contact_developer">Contacter le développeur</string>
<string name="rate_tasks">Noter Tasks</string>
<string name="quiet_hours_summary">Ni sonnerie ni vibreur pendant les heures de repos</string>
<string name="TLA_menu_donate">Remercier</string>
<string name="error">Erreur</string>
<string name="select_amount">Choisir le montant</string>

@ -345,7 +345,6 @@ Se visualizzi questo errore più volte, ti consigliamo di cancellare tutti i dat
<string name="help_and_feedback">Aiuto &amp; Suggerimenti</string>
<string name="contact_developer">Contatta lo sviluppatore</string>
<string name="rate_tasks">Attività</string>
<string name="quiet_hours_summary">Durante le ore di quiete né audio né vibrazione </string>
<string name="TLA_menu_donate">Dona</string>
<string name="error">Errore</string>
<string name="select_amount">Seleziona quantità</string>

@ -350,7 +350,6 @@
<string name="help_and_feedback">ヘルプ &amp; フィードバック</string>
<string name="contact_developer">開発者に連絡</string>
<string name="rate_tasks">Tasks を評価</string>
<string name="quiet_hours_summary">消音時間の間はサウンドも振動も行いません</string>
<string name="TLA_menu_donate">寄付</string>
<string name="error">エラー</string>
<string name="select_amount">金額を選択</string>

@ -352,7 +352,6 @@ Tasks의 백업에서 당신의 일정을 복구하시기 바랍니다.
<string name="help_and_feedback">도움말 &amp; 피드백</string>
<string name="contact_developer">개발자와 연락</string>
<string name="rate_tasks">Tasks 평가하기</string>
<string name="quiet_hours_summary">무음 시간대에는 소리나 진동 해제</string>
<string name="TLA_menu_donate">기부하기</string>
<string name="error">오류</string>
<string name="select_amount">숫자 선택</string>

@ -344,7 +344,6 @@
<string name="help_and_feedback">Help &amp; Terugkoppeling</string>
<string name="contact_developer">Contact ontwikkelaar</string>
<string name="rate_tasks">Beoordeel Taken</string>
<string name="quiet_hours_summary">Geen geluid of trillen tijdens stillen uren</string>
<string name="TLA_menu_donate">Doneer</string>
<string name="error">Fout</string>
<string name="select_amount">Selecteer aantal</string>

@ -342,7 +342,6 @@ das tarefas através de um backup em Definições-&gt;Sincronização e backup-&
<string name="help_and_feedback">Ajuda e comentários</string>
<string name="contact_developer">Contacte o programador</string>
<string name="rate_tasks">Avaliar o Tasks</string>
<string name="quiet_hours_summary">Sem som nem vibração nas horas de silêncio</string>
<string name="TLA_menu_donate">Donativos</string>
<string name="error">Erro</string>
<string name="select_amount">Selecione o valor</string>

@ -349,7 +349,6 @@
<string name="help_and_feedback">Помощь и обратная связь</string>
<string name="contact_developer">Связь с разработчиком</string>
<string name="rate_tasks">Оставить отзыв</string>
<string name="quiet_hours_summary">Выкл. звук или вибрацию в тихие часы</string>
<string name="TLA_menu_donate">Поддержать автора ($)</string>
<string name="error">Ошибка</string>
<string name="select_amount">Выберите количество</string>

@ -334,7 +334,6 @@
<string name="help_and_feedback">Pomoc a spätná väzba</string>
<string name="contact_developer">Kontaktovať vývojára</string>
<string name="rate_tasks">Ohodnotiť Tasks</string>
<string name="quiet_hours_summary">Žiadne zvonenie alebo vibrovanie počas tichých hodín</string>
<string name="TLA_menu_donate">Darovať</string>
<string name="error">Chyba</string>
<string name="select_amount">Vybrať sumu</string>

@ -77,7 +77,7 @@
<string name="help_and_feedback">Help &amp; Feedback</string>
<string name="contact_developer">Contact developer</string>
<string name="rate_tasks">Rate Tasks</string>
<string name="quiet_hours_summary">No sound or vibration during quiet hours</string>
<string name="quiet_hours_summary">No reminders during quiet hours</string>
<string name="TLA_menu_donate">Donate</string>
<string name="error">Error</string>
<string name="select_amount">Select amount</string>

Loading…
Cancel
Save