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