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)