From 43e802fb8e7dfe0a94f85584345a8a58df1fe5f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lubo=C5=A1=20Lu=C5=88=C3=A1k?= Date: Wed, 13 Sep 2017 16:25:24 +0200 Subject: [PATCH] implement custom snooze for notifications --- uhabits-android/src/main/AndroidManifest.xml | 1 + .../notifications/SnoozeDelayActivity.java | 85 +++++++++++++++++++ .../uhabits/receivers/ReminderController.java | 24 +++++- .../uhabits/receivers/ReminderReceiver.java | 10 ++- .../src/main/res/values/constants.xml | 2 + .../src/main/res/values/strings.xml | 1 + .../receivers/ReminderControllerTest.java | 2 +- 7 files changed, 122 insertions(+), 3 deletions(-) create mode 100644 uhabits-android/src/main/java/org/isoron/uhabits/notifications/SnoozeDelayActivity.java diff --git a/uhabits-android/src/main/AndroidManifest.xml b/uhabits-android/src/main/AndroidManifest.xml index b7cbb4520..ca802a5d6 100644 --- a/uhabits-android/src/main/AndroidManifest.xml +++ b/uhabits-android/src/main/AndroidManifest.xml @@ -91,6 +91,7 @@ android:name="android.support.PARENT_ACTIVITY" android:value=".activities.habits.list.ListHabitsActivity"/> + time) + time += DateUtils.DAY_LENGTH; + time = applyTimezone(time); + + Intent intent = new Intent( ReminderReceiver.ACTION_SNOOZE_REMINDER_SET, getIntent().getData(), + this, ReminderReceiver.class ); + intent.putExtra("reminderTime", time); + sendBroadcast(intent); + + finish(); + } + + @Override + public void onTimeCleared(RadialPickerLayout view) + { + Intent intent = new Intent( ReminderReceiver.ACTION_DISMISS_REMINDER, getIntent().getData(), + this, ReminderReceiver.class ); + sendBroadcast(intent); + + finish(); + } +} diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/receivers/ReminderController.java b/uhabits-android/src/main/java/org/isoron/uhabits/receivers/ReminderController.java index ae88f55c9..179b16e39 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/receivers/ReminderController.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/receivers/ReminderController.java @@ -19,12 +19,15 @@ package org.isoron.uhabits.receivers; +import android.content.*; +import android.net.*; import android.support.annotation.*; import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.core.preferences.*; import org.isoron.uhabits.core.reminders.*; import org.isoron.uhabits.core.ui.*; +import org.isoron.uhabits.notifications.*; import javax.inject.*; @@ -65,13 +68,32 @@ public class ReminderController reminderScheduler.scheduleAll(); } - public void onSnooze(@NonNull Habit habit) + public void onSnooze(@NonNull Habit habit, final Context context) { long snoozeInterval = preferences.getSnoozeInterval(); + if (snoozeInterval < 0) + { + context.sendBroadcast( new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)); + Intent intent = new Intent( SnoozeDelayActivity.ACTION_ASK_SNOOZE, Uri.parse( habit.getUriString()), + context, SnoozeDelayActivity.class ); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(intent); + return; + } + + snoozeNotificationAddDelay(habit, snoozeInterval); + } + + public void snoozeNotificationAddDelay(@NonNull Habit habit, long snoozeInterval) + { long now = applyTimezone(getLocalTime()); long reminderTime = now + snoozeInterval * 60 * 1000; + snoozeNotificationSetReminderTime(habit, reminderTime); + } + public void snoozeNotificationSetReminderTime(@NonNull Habit habit, long reminderTime) + { reminderScheduler.schedule(habit, reminderTime); notificationTray.cancel(habit); } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/receivers/ReminderReceiver.java b/uhabits-android/src/main/java/org/isoron/uhabits/receivers/ReminderReceiver.java index cb382a950..c6990b4dd 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/receivers/ReminderReceiver.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/receivers/ReminderReceiver.java @@ -46,6 +46,9 @@ public class ReminderReceiver extends BroadcastReceiver public static final String ACTION_SNOOZE_REMINDER = "org.isoron.uhabits.ACTION_SNOOZE_REMINDER"; + public static final String ACTION_SNOOZE_REMINDER_SET = + "org.isoron.uhabits.ACTION_SNOOZE_REMINDER_SET"; + private static final String TAG = "ReminderReceiver"; @Override @@ -90,7 +93,12 @@ public class ReminderReceiver extends BroadcastReceiver case ACTION_SNOOZE_REMINDER: if (habit == null) return; - reminderController.onSnooze(habit); + reminderController.onSnooze(habit,context); + break; + + case ACTION_SNOOZE_REMINDER_SET: + if (habit == null) return; + reminderController.snoozeNotificationSetReminderTime(habit, reminderTime); break; case Intent.ACTION_BOOT_COMPLETED: diff --git a/uhabits-android/src/main/res/values/constants.xml b/uhabits-android/src/main/res/values/constants.xml index 94ae54340..1b46ccc5d 100644 --- a/uhabits-android/src/main/res/values/constants.xml +++ b/uhabits-android/src/main/res/values/constants.xml @@ -35,6 +35,7 @@ @string/interval_4_hour @string/interval_8_hour @string/interval_24_hour + @string/interval_always_ask @@ -45,6 +46,7 @@ 240 480 1440 + -1 diff --git a/uhabits-android/src/main/res/values/strings.xml b/uhabits-android/src/main/res/values/strings.xml index 1671734fd..821cf2298 100644 --- a/uhabits-android/src/main/res/values/strings.xml +++ b/uhabits-android/src/main/res/values/strings.xml @@ -83,6 +83,7 @@ 4 hours 8 hours 24 hours + Always ask Toggle with short press Put checkmarks with a single tap instead of press-and-hold. More convenient, but might cause accidental toggles. Snooze interval on reminders diff --git a/uhabits-android/src/test/java/org/isoron/uhabits/receivers/ReminderControllerTest.java b/uhabits-android/src/test/java/org/isoron/uhabits/receivers/ReminderControllerTest.java index 93b199a10..7b0406832 100644 --- a/uhabits-android/src/test/java/org/isoron/uhabits/receivers/ReminderControllerTest.java +++ b/uhabits-android/src/test/java/org/isoron/uhabits/receivers/ReminderControllerTest.java @@ -70,7 +70,7 @@ public class ReminderControllerTest extends BaseAndroidJVMTest DateUtils.setFixedLocalTime(now); when(preferences.getSnoozeInterval()).thenReturn(15L); - controller.onSnooze(habit); + controller.onSnooze(habit,null); verify(reminderScheduler).schedule(habit, nowTz + 900000); verify(notificationTray).cancel(habit);