diff --git a/android-pickers/src/main/java/com/android/datetimepicker/time/TimePickerDialog.java b/android-pickers/src/main/java/com/android/datetimepicker/time/TimePickerDialog.java index 0bbb741e2..7cbdd3cd3 100644 --- a/android-pickers/src/main/java/com/android/datetimepicker/time/TimePickerDialog.java +++ b/android-pickers/src/main/java/com/android/datetimepicker/time/TimePickerDialog.java @@ -63,6 +63,7 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue private static final int PULSE_ANIMATOR_DELAY = 300; private OnTimeSetListener mCallback; + private DialogInterface.OnDismissListener dismissListener; private HapticFeedbackController mHapticFeedbackController; @@ -998,4 +999,15 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue return false; } } + + public void setDismissListener( DialogInterface.OnDismissListener listener ) { + dismissListener = listener; + } + + @Override + public void onDismiss(DialogInterface dialog) { + super.onDismiss(dialog); + if( dismissListener != null ) + dismissListener.onDismiss(dialog); + } } diff --git a/uhabits-android/src/main/AndroidManifest.xml b/uhabits-android/src/main/AndroidManifest.xml index b7cbb4520..99e5b20fb 100644 --- a/uhabits-android/src/main/AndroidManifest.xml +++ b/uhabits-android/src/main/AndroidManifest.xml @@ -91,6 +91,11 @@ android:name="android.support.PARENT_ACTIVITY" android:value=".activities.habits.list.ListHabitsActivity"/> + + = 0 && i <= snoozeDelay.length); + if( snoozeDelay[ i ] < 0 ) + { + activeDelayDialog.setOnDismissListener(null); + AskCustomSnooze(); + return; + } + Intent intent = new Intent( ReminderReceiver.ACTION_SNOOZE_REMINDER_DELAY, getIntent().getData(), + this, ReminderReceiver.class ); + intent.putExtra("snoozeDelay", snoozeDelay[ i ]); + sendBroadcast(intent); + } + + private void AskCustomSnooze() + { + final Calendar calendar = Calendar.getInstance(); + int hour = calendar.get(Calendar.HOUR_OF_DAY); + int minute = calendar.get(Calendar.MINUTE); + TimePickerDialog dialog; + dialog = TimePickerDialog.newInstance(this, + hour, minute, DateFormat.is24HourFormat(this)); + HabitsApplicationComponent component = ((HabitsApplication) getApplicationContext()).getComponent(); + dialog.setThemeDark(component.getPreferences().getTheme() == THEME_DARK); + dialog.setDismissListener(this); + dialog.show(getSupportFragmentManager(),"timePicker"); + } + + @Override + public void onTimeSet(RadialPickerLayout view, int hourOfDay, int minute) + { + Calendar calendar = DateUtils.getStartOfTodayCalendar(); + calendar.set(Calendar.HOUR_OF_DAY, hourOfDay); + calendar.set(Calendar.MINUTE, minute); + calendar.set(Calendar.SECOND, 0); + Long time = calendar.getTimeInMillis(); + if (DateUtils.getLocalTime() > 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); + } + + @Override + public void onTimeCleared(RadialPickerLayout view) + { + Intent intent = new Intent( ReminderReceiver.ACTION_DISMISS_REMINDER, getIntent().getData(), + this, ReminderReceiver.class ); + sendBroadcast(intent); + } + + @Override + public void onDismiss(DialogInterface dialogInterface) + { + 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..b80baf11b 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,12 @@ 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"; + + public static final String ACTION_SNOOZE_REMINDER_DELAY = + "org.isoron.uhabits.ACTION_SNOOZE_REMINDER_DELAY"; + private static final String TAG = "ReminderReceiver"; @Override @@ -90,7 +96,18 @@ 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 ACTION_SNOOZE_REMINDER_DELAY: + if (habit == null) return; + long snoozeDelay = intent.getIntExtra("snoozeDelay", 0); + reminderController.snoozeNotificationAddDelay(habit, snoozeDelay); 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..e8d08c0b5 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,8 +46,31 @@ 240 480 1440 + -1 + + @string/interval_15_minutes + @string/interval_30_minutes + @string/interval_1_hour + @string/interval_2_hour + @string/interval_4_hour + @string/interval_8_hour + @string/interval_24_hour + @string/interval_custom + + + + 15 + 30 + 60 + 120 + 240 + 480 + 1440 + -1 + + @string/every_day @string/every_week diff --git a/uhabits-android/src/main/res/values/strings.xml b/uhabits-android/src/main/res/values/strings.xml index 3ea1d2f76..a78c873cb 100644 --- a/uhabits-android/src/main/res/values/strings.xml +++ b/uhabits-android/src/main/res/values/strings.xml @@ -83,6 +83,8 @@ 4 hours 8 hours 24 hours + Always ask + Custom... 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 @@ -95,6 +97,7 @@ Name Settings Snooze interval + Select snooze delay Did you know? To rearrange the entries, press-and-hold on the name of the habit, then drag it to the correct place. 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);