diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml
index b6048e064..b8025048f 100644
--- a/src/main/AndroidManifest.xml
+++ b/src/main/AndroidManifest.xml
@@ -109,7 +109,8 @@
+ android:theme="@style/Tasks.Dialog"
+ android:taskAffinity="" />
{
if (result.get()) {
onModelUpdated(item);
item.markSaved();
+ log.debug("{} {}", op, item);
}
}
return result.get();
@@ -247,6 +248,11 @@ public class DatabaseDao {
}
return result;
}
+
+ @Override
+ public String toString() {
+ return "INSERT";
+ }
};
return insertOrUpdateAndRecordChanges(item, insert);
}
@@ -269,6 +275,11 @@ public class DatabaseDao {
return database.update(table.name, values,
AbstractModel.ID_PROPERTY.eq(item.getId()).toString()) > 0;
}
+
+ @Override
+ public String toString() {
+ return "UPDATE";
+ }
};
return insertOrUpdateAndRecordChanges(item, update);
}
diff --git a/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.java b/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.java
index 29b7a23f1..da8dcc327 100755
--- a/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.java
+++ b/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.java
@@ -79,6 +79,7 @@ import org.slf4j.LoggerFactory;
import org.tasks.R;
import org.tasks.activities.DateAndTimePickerActivity;
import org.tasks.activities.LocationPickerActivity;
+import org.tasks.activities.TimePickerActivity;
import org.tasks.injection.InjectingFragment;
import org.tasks.location.Geofence;
import org.tasks.location.GeofenceService;
@@ -904,7 +905,7 @@ ViewPager.OnPageChangeListener, EditNoteActivity.UpdatesChangedListener {
}
if (requestCode == HideUntilControlSet.REQUEST_HIDE_UNTIL && resultCode == Activity.RESULT_OK) {
- long timestamp = data.getLongExtra(DateAndTimePickerActivity.EXTRA_TIMESTAMP, 0L);
+ long timestamp = data.getLongExtra(TimePickerActivity.EXTRA_TIMESTAMP, 0L);
if (timestamp > 0) {
hideUntilControls.setCustomDate(timestamp);
} else {
@@ -912,7 +913,7 @@ ViewPager.OnPageChangeListener, EditNoteActivity.UpdatesChangedListener {
}
return;
} else if (requestCode == ReminderControlSet.REQUEST_NEW_ALARM && resultCode == Activity.RESULT_OK) {
- long timestamp = data.getLongExtra(DateAndTimePickerActivity.EXTRA_TIMESTAMP, 0L);
+ long timestamp = data.getLongExtra(TimePickerActivity.EXTRA_TIMESTAMP, 0L);
if (timestamp > 0) {
reminderControlSet.addAlarmRow(timestamp);
} else {
diff --git a/src/main/java/com/todoroo/astrid/reminders/SnoozeDialog.java b/src/main/java/com/todoroo/astrid/reminders/SnoozeDialog.java
deleted file mode 100644
index 807e258a5..000000000
--- a/src/main/java/com/todoroo/astrid/reminders/SnoozeDialog.java
+++ /dev/null
@@ -1,117 +0,0 @@
-package com.todoroo.astrid.reminders;
-
-import android.app.Dialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.support.v4.app.DialogFragment;
-import android.support.v7.app.AlertDialog;
-import android.view.LayoutInflater;
-import android.view.MotionEvent;
-import android.view.View;
-import android.widget.LinearLayout;
-import android.widget.Spinner;
-
-import com.todoroo.andlib.utility.AndroidUtilities;
-import com.todoroo.andlib.utility.DateUtilities;
-import com.todoroo.astrid.repeats.RepeatControlSet;
-import com.todoroo.astrid.ui.NumberPicker;
-
-import org.tasks.R;
-
-import butterknife.ButterKnife;
-import butterknife.InjectView;
-
-public class SnoozeDialog extends DialogFragment {
-
- @InjectView(R.id.snoozePicker) LinearLayout snoozePicker;
- @InjectView(R.id.numberPicker) NumberPicker snoozeValue;
- @InjectView(R.id.numberUnits) Spinner snoozeUnits;
-
- private SnoozeCallback snoozeCallback;
- private DialogInterface.OnDismissListener onDismissListener;
- private String title;
-
- @NonNull
- @Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- LayoutInflater mInflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- View layout = mInflater.inflate(R.layout.snooze_dialog, null);
- ButterKnife.inject(this, layout);
-
- snoozeValue.setIncrementBy(1);
- snoozeValue.setRange(1, 99);
- snoozeUnits.setSelection(RepeatControlSet.INTERVAL_HOURS);
- snoozeUnits.setOnTouchListener(new View.OnTouchListener() {
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- AndroidUtilities.hideSoftInputForViews(getActivity(), snoozePicker);
- return false;
- }
- });
-
- return new AlertDialog.Builder(getActivity(), R.style.Tasks_Dialog)
- .setTitle(title)
- .setView(layout)
- .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- long time = DateUtilities.now();
- int value = snoozeValue.getCurrent();
- switch (snoozeUnits.getSelectedItemPosition()) {
- case RepeatControlSet.INTERVAL_DAYS:
- time += value * DateUtilities.ONE_DAY;
- break;
- case RepeatControlSet.INTERVAL_HOURS:
- time += value * DateUtilities.ONE_HOUR;
- break;
- case RepeatControlSet.INTERVAL_MINUTES:
- time += value * DateUtilities.ONE_MINUTE;
- break;
- case RepeatControlSet.INTERVAL_WEEKS:
- time += value * 7 * DateUtilities.ONE_DAY;
- break;
- case RepeatControlSet.INTERVAL_MONTHS:
- time = DateUtilities.addCalendarMonthsToUnixtime(time, 1);
- break;
- case RepeatControlSet.INTERVAL_YEARS:
- time = DateUtilities.addCalendarMonthsToUnixtime(time, 12);
- break;
- }
-
- snoozeCallback.snoozeForTime(time);
- }
- })
- .setOnDismissListener(this)
- .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
-
- }
- })
- .show();
-
- }
-
- @Override
- public void onDismiss(DialogInterface dialog) {
- super.onDismiss(dialog);
-
- if (onDismissListener != null) {
- onDismissListener.onDismiss(dialog);
- }
- }
-
- public void setSnoozeCallback(SnoozeCallback snoozeCallback) {
- this.snoozeCallback = snoozeCallback;
- }
-
- public void setOnDismissListener(DialogInterface.OnDismissListener onDismissListener) {
- this.onDismissListener = onDismissListener;
- }
-
- public void setTitle(String title) {
- this.title = title;
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/todoroo/astrid/repeats/RepeatControlSet.java b/src/main/java/com/todoroo/astrid/repeats/RepeatControlSet.java
index 47f7efe9f..9874f69c2 100644
--- a/src/main/java/com/todoroo/astrid/repeats/RepeatControlSet.java
+++ b/src/main/java/com/todoroo/astrid/repeats/RepeatControlSet.java
@@ -27,7 +27,6 @@ import com.google.ical.values.Weekday;
import com.google.ical.values.WeekdayNum;
import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.astrid.data.Task;
-import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.ui.DateAndTimeDialog;
import com.todoroo.astrid.ui.DateAndTimeDialog.DateAndTimeDialogListener;
import com.todoroo.astrid.ui.DateAndTimePicker;
diff --git a/src/main/java/org/tasks/activities/DateAndTimePickerActivity.java b/src/main/java/org/tasks/activities/DateAndTimePickerActivity.java
index 39434a5c7..d92fe8b7f 100644
--- a/src/main/java/org/tasks/activities/DateAndTimePickerActivity.java
+++ b/src/main/java/org/tasks/activities/DateAndTimePickerActivity.java
@@ -1,6 +1,5 @@
package org.tasks.activities;
-import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
@@ -14,13 +13,12 @@ import org.tasks.dialogs.MyDatePickerDialog;
import static org.tasks.date.DateTimeUtils.currentTimeMillis;
-public class DateAndTimePickerActivity extends FragmentActivity implements DatePickerDialog.OnDateSetListener, DialogInterface.OnDismissListener {
+public class DateAndTimePickerActivity extends FragmentActivity implements DatePickerDialog.OnDateSetListener, DialogInterface.OnCancelListener {
private static final String FRAG_TAG_DATE_PICKER = "frag_tag_date_picker";
- private static final int REQUEST_PICK_TIME = 12345;
- public static final String EXTRA_TIMESTAMP = "extra_timestamp";
private static final String EXTRA_DATE_SELECTED = "extra_date_selected";
+ public static final String EXTRA_TIMESTAMP = "extra_timestamp";
private DateTime initial;
private boolean dateSelected;
@@ -45,7 +43,7 @@ public class DateAndTimePickerActivity extends FragmentActivity implements DateP
datePickerDialog.initialize(null, initial.getYear(), initial.getMonthOfYear() - 1, initial.getDayOfMonth(), false);
datePickerDialog.show(supportFragmentManager, FRAG_TAG_DATE_PICKER);
}
- datePickerDialog.setOnDismissListener(this);
+ datePickerDialog.setOnCancelListener(this);
datePickerDialog.setOnDateSetListener(this);
}
@@ -58,32 +56,17 @@ public class DateAndTimePickerActivity extends FragmentActivity implements DateP
@Override
public void onDateSet(DatePickerDialog datePickerDialog, int year, int month, int day) {
dateSelected = true;
- datePickerDialog.dismiss();
final long timestamp = initial.withYear(year).withMonthOfYear(month + 1).withDayOfMonth(day).getMillis();
- startActivityForResult(new Intent(this, TimePickerActivity.class) {{
+ datePickerDialog.dismiss();
+ startActivity(new Intent(this, TimePickerActivity.class) {{
+ addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
putExtra(TimePickerActivity.EXTRA_TIMESTAMP, timestamp);
- }}, REQUEST_PICK_TIME);
- }
-
- @Override
- protected void onActivityResult(int requestCode, int resultCode, final Intent data) {
- if (requestCode == REQUEST_PICK_TIME) {
- if (resultCode == Activity.RESULT_OK) {
- setResult(RESULT_OK, new Intent() {{
- putExtra(EXTRA_TIMESTAMP, data.getLongExtra(TimePickerActivity.EXTRA_TIMESTAMP, 0L));
- }});
- } else {
- setResult(RESULT_CANCELED);
- }
- finish();
- } else {
- super.onActivityResult(requestCode, resultCode, data);
- }
+ }});
+ finish();
}
@Override
- public void onDismiss(DialogInterface dialog) {
- setResult(RESULT_CANCELED);
- finish();
+ public void onCancel(DialogInterface dialog) {
+ finishAffinity();
}
}
diff --git a/src/main/java/org/tasks/dialogs/MyDatePickerDialog.java b/src/main/java/org/tasks/dialogs/MyDatePickerDialog.java
index 3198eedd8..5cc00cf6e 100644
--- a/src/main/java/org/tasks/dialogs/MyDatePickerDialog.java
+++ b/src/main/java/org/tasks/dialogs/MyDatePickerDialog.java
@@ -6,9 +6,9 @@ import com.fourmob.datetimepicker.date.DatePickerDialog;
public class MyDatePickerDialog extends DatePickerDialog {
- private DialogInterface.OnDismissListener listener;
+ private DialogInterface.OnCancelListener listener;
- public void setOnDismissListener(DialogInterface.OnDismissListener listener) {
+ public void setOnCancelListener(DialogInterface.OnCancelListener listener) {
this.listener = listener;
}
@@ -17,7 +17,7 @@ public class MyDatePickerDialog extends DatePickerDialog {
super.onCancel(dialog);
if (listener != null) {
- listener.onDismiss(dialog);
+ listener.onCancel(dialog);
}
}
}
diff --git a/src/main/java/org/tasks/dialogs/MyTimePickerDialog.java b/src/main/java/org/tasks/dialogs/MyTimePickerDialog.java
index e31b612bb..4aa9a46d5 100644
--- a/src/main/java/org/tasks/dialogs/MyTimePickerDialog.java
+++ b/src/main/java/org/tasks/dialogs/MyTimePickerDialog.java
@@ -20,13 +20,4 @@ public class MyTimePickerDialog extends TimePickerDialog {
listener.onDismiss(dialog);
}
}
-
- @Override
- public void onCancel(DialogInterface dialog) {
- super.onCancel(dialog);
-
- if (listener != null) {
- listener.onDismiss(dialog);
- }
- }
}
diff --git a/src/main/java/org/tasks/injection/DialogFragmentModule.java b/src/main/java/org/tasks/injection/DialogFragmentModule.java
index e040f8ec0..b24b9f98c 100644
--- a/src/main/java/org/tasks/injection/DialogFragmentModule.java
+++ b/src/main/java/org/tasks/injection/DialogFragmentModule.java
@@ -5,6 +5,7 @@ import android.support.v4.app.FragmentActivity;
import org.tasks.dialogs.LocationPickerDialog;
import org.tasks.reminders.NotificationDialog;
+import org.tasks.reminders.SnoozeDialog;
import dagger.Module;
import dagger.Provides;
@@ -12,7 +13,8 @@ import dagger.Provides;
@Module(addsTo = TasksModule.class,
injects = {
LocationPickerDialog.class,
- NotificationDialog.class
+ NotificationDialog.class,
+ SnoozeDialog.class
},
library = true)
public class DialogFragmentModule {
diff --git a/src/main/java/org/tasks/reminders/SnoozeActivity.java b/src/main/java/org/tasks/reminders/SnoozeActivity.java
index 0907a0626..a4a0831af 100644
--- a/src/main/java/org/tasks/reminders/SnoozeActivity.java
+++ b/src/main/java/org/tasks/reminders/SnoozeActivity.java
@@ -1,23 +1,22 @@
package org.tasks.reminders;
import android.content.DialogInterface;
+import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.reminders.SnoozeCallback;
-import com.todoroo.astrid.reminders.SnoozeDialog;
import com.todoroo.astrid.service.StartupService;
import com.todoroo.astrid.service.TaskService;
-import org.tasks.R;
-import org.tasks.injection.InjectingAppCompatActivity;
+import org.tasks.activities.TimePickerActivity;
import org.tasks.injection.InjectingFragmentActivity;
import org.tasks.notifications.NotificationManager;
import javax.inject.Inject;
-public class SnoozeActivity extends InjectingFragmentActivity implements SnoozeCallback, DialogInterface.OnDismissListener {
+public class SnoozeActivity extends InjectingFragmentActivity implements SnoozeCallback, DialogInterface.OnCancelListener {
private static final String FRAG_TAG_SNOOZE_DIALOG = "frag_tag_snooze_dialog";
@@ -42,25 +41,37 @@ public class SnoozeActivity extends InjectingFragmentActivity implements SnoozeC
fragmentByTag.show(supportFragmentManager, FRAG_TAG_SNOOZE_DIALOG);
}
taskId = getIntent().getLongExtra(EXTRA_TASK_ID, 0L);
- fragmentByTag.setOnDismissListener(this);
- fragmentByTag.setTitle(getString(R.string.rmd_NoA_snooze));
+ fragmentByTag.setOnCancelListener(this);
fragmentByTag.setSnoozeCallback(this);
}
@Override
public void snoozeForTime(long time) {
- setResult(RESULT_OK);
Task task = new Task();
task.setId(taskId);
task.setReminderSnooze(time);
taskService.save(task);
notificationManager.cancel(taskId);
+ setResult(RESULT_OK);
finish();
}
@Override
- public void onDismiss(DialogInterface dialog) {
- setResult(RESULT_CANCELED);
+ public void onCancel(DialogInterface dialog) {
finish();
}
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (requestCode == SnoozeDialog.REQUEST_DATE_TIME) {
+ if (resultCode == RESULT_OK && data != null) {
+ snoozeForTime(data.getLongExtra(TimePickerActivity.EXTRA_TIMESTAMP, 0L));
+ } else {
+ finish();
+ }
+ overridePendingTransition(0, 0);
+ } else {
+ super.onActivityResult(requestCode, resultCode, data);
+ }
+ }
}
diff --git a/src/main/java/org/tasks/reminders/SnoozeDialog.java b/src/main/java/org/tasks/reminders/SnoozeDialog.java
new file mode 100644
index 000000000..b43f6e87f
--- /dev/null
+++ b/src/main/java/org/tasks/reminders/SnoozeDialog.java
@@ -0,0 +1,126 @@
+package org.tasks.reminders;
+
+import android.app.Dialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.v7.app.AlertDialog;
+import android.widget.ArrayAdapter;
+
+import com.todoroo.astrid.reminders.SnoozeCallback;
+
+import org.joda.time.DateTime;
+import org.tasks.R;
+import org.tasks.activities.DateAndTimePickerActivity;
+import org.tasks.injection.ForApplication;
+import org.tasks.injection.InjectingDialogFragment;
+import org.tasks.preferences.Preferences;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import javax.inject.Inject;
+
+import static com.todoroo.andlib.utility.DateUtilities.getTimeString;
+
+public class SnoozeDialog extends InjectingDialogFragment {
+
+ public static final int REQUEST_DATE_TIME = 10101;
+
+ @Inject Preferences preferences;
+ @Inject @ForApplication Context context;
+
+ private DateTime now = new DateTime();
+ private SnoozeCallback snoozeCallback;
+ private DialogInterface.OnCancelListener onCancelListener;
+ private List snoozeTimes = new ArrayList<>();
+ private ArrayAdapter adapter;
+
+ private DateTime getDateTimeShortcut(int resId, long def) {
+ return now.withMillisOfDay(preferences.getInt(getString(resId), (int) def));
+ }
+
+ private void add(int resId, DateTime dateTime) {
+ adapter.add(getString(resId, getTimeString(context, dateTime.toDate())));
+ snoozeTimes.add(dateTime.getMillis());
+ }
+
+ @NonNull
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ adapter = new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1);
+ DateTime morning = getDateTimeShortcut(R.string.p_date_shortcut_morning, TimeUnit.HOURS.toMillis(9));
+ DateTime afternoon = getDateTimeShortcut(R.string.p_date_shortcut_afternoon, TimeUnit.HOURS.toMillis(13));
+ DateTime evening = getDateTimeShortcut(R.string.p_date_shortcut_evening, TimeUnit.HOURS.toMillis(17));
+ DateTime night = getDateTimeShortcut(R.string.p_date_shortcut_night, TimeUnit.HOURS.toMillis(20));
+ DateTime tomorrowMorning = morning.plusDays(1);
+ DateTime tomorrowAfternoon = afternoon.plusDays(1);
+
+ adapter.add(getString(R.string.date_shortcut_hour));
+ snoozeTimes.add(0L);
+
+ DateTime hourCutoff = new DateTime().plusMinutes(75);
+
+ if (morning.isAfter(hourCutoff)) {
+ add(R.string.date_shortcut_morning, morning);
+ add(R.string.date_shortcut_afternoon, afternoon);
+ } else if (afternoon.isAfter(hourCutoff)) {
+ add(R.string.date_shortcut_afternoon, afternoon);
+ add(R.string.date_shortcut_evening, evening);
+ } else if (evening.isAfter(hourCutoff)) {
+ add(R.string.date_shortcut_evening, evening);
+ add(R.string.date_shortcut_night, night);
+ } else if (night.isAfter(hourCutoff)) {
+ add(R.string.date_shortcut_night, night);
+ add(R.string.date_shortcut_tomorrow_morning, tomorrowMorning);
+ } else {
+ add(R.string.date_shortcut_tomorrow_morning, tomorrowMorning);
+ add(R.string.date_shortcut_tomorrow_afternoon, tomorrowAfternoon);
+ }
+ adapter.add(getString(R.string.pick_a_date_and_time));
+
+ return new AlertDialog.Builder(getActivity(), R.style.Tasks_Dialog)
+ .setTitle(R.string.rmd_NoA_snooze)
+ .setAdapter(adapter, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ switch (which) {
+ case 0:
+ snoozeCallback.snoozeForTime(new DateTime().plusHours(1).getMillis());
+ break;
+ case 1:
+ case 2:
+ snoozeCallback.snoozeForTime(snoozeTimes.get(which));
+ break;
+ case 3:
+ dialog.dismiss();
+ getActivity().startActivityForResult(new Intent(context, DateAndTimePickerActivity.class) {{
+ putExtra(DateAndTimePickerActivity.EXTRA_TIMESTAMP, new DateTime().plusMinutes(30).getMillis());
+ }}, REQUEST_DATE_TIME);
+ break;
+ }
+ }
+ })
+ .show();
+ }
+
+ @Override
+ public void onCancel(DialogInterface dialog) {
+ super.onCancel(dialog);
+
+ if (onCancelListener != null) {
+ onCancelListener.onCancel(dialog);
+ }
+ }
+
+ public void setSnoozeCallback(SnoozeCallback snoozeCallback) {
+ this.snoozeCallback = snoozeCallback;
+ }
+
+ public void setOnCancelListener(DialogInterface.OnCancelListener onCancelListener) {
+ this.onCancelListener = onCancelListener;
+ }
+}
\ No newline at end of file
diff --git a/src/main/res/layout/snooze_dialog.xml b/src/main/res/layout/snooze_dialog.xml
deleted file mode 100644
index b92cdf0a3..000000000
--- a/src/main/res/layout/snooze_dialog.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/main/res/values/keys.xml b/src/main/res/values/keys.xml
index 30b188556..b02a6b657 100644
--- a/src/main/res/values/keys.xml
+++ b/src/main/res/values/keys.xml
@@ -10,6 +10,11 @@
AIzaSyBXGYNWNQcfse4JS5gI9teTSKMzinWzL2M
+ date_shortcut_morning
+ date_shortcut_afternoon
+ date_shortcut_evening
+ date_shortcut_night
+
custom_files_dir
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index 2219d9b77..24285144c 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -105,6 +105,13 @@
Geolocation Reminders
Tags
Filters
+ For an hour
+ Morning (%s)
+ Afternoon (%s)
+ Evening (%s)
+ Night (%s)
+ Tomorrow morning (%s)
+ Tomorrow afternoon (%s)