From f42d5013f3146b59b982b02e72cbfb13e310f480 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Thu, 26 Mar 2015 10:26:37 -0500 Subject: [PATCH] Use betterpickers calendar and radial pickers * TimePreference * Custom alarms * Custom HideUntil dates --- build.gradle | 5 ++ src/main/AndroidManifest.xml | 13 ++- .../astrid/activity/TaskEditFragment.java | 4 +- .../astrid/alarms/AlarmControlSet.java | 67 ++++++-------- .../astrid/reminders/ReminderPreferences.java | 67 ++++++++++---- .../astrid/repeats/RepeatControlSet.java | 8 +- .../todoroo/astrid/ui/DateAndTimeDialog.java | 16 ---- .../todoroo/astrid/ui/DateAndTimePicker.java | 8 -- .../todoroo/astrid/ui/DateChangedAlerts.java | 5 -- .../astrid/ui/HideUntilControlSet.java | 35 ++++---- .../todoroo/astrid/ui/ReminderControlSet.java | 11 +-- .../tasks/activities/TimePickerActivity.java | 43 +++++++++ .../java/org/tasks/date/DateTimeUtils.java | 8 ++ .../dialogs/DateAndTimePickerDialog.java | 78 ++++++++++++++++ .../dialogs/MyCalendarDatePickerDialog.java | 21 +++++ .../java/org/tasks/ui/TimePreference.java | 89 +++++++------------ src/main/res/values/attrs.xml | 4 + src/main/res/values/styles.xml | 6 ++ src/main/res/xml/preferences_reminders.xml | 7 +- 19 files changed, 313 insertions(+), 182 deletions(-) create mode 100644 src/main/java/org/tasks/activities/TimePickerActivity.java create mode 100644 src/main/java/org/tasks/dialogs/DateAndTimePickerDialog.java create mode 100644 src/main/java/org/tasks/dialogs/MyCalendarDatePickerDialog.java diff --git a/build.gradle b/build.gradle index 829aece8a..e50c4709d 100644 --- a/build.gradle +++ b/build.gradle @@ -91,6 +91,11 @@ dependencies { compile group: 'net.i2p.android.ext', name: 'floatingactionbutton', version: '1.8.0' + compile ("com.doomonafireball.betterpickers:library:1.5.4") { + exclude group: 'com.android.support', module: 'support-v4' + exclude group: 'org.jraf', module: 'android-switch-backport' + } + compile(group: 'com.google.apis', name: 'google-api-services-tasks', version: 'v1-rev33-1.18.0-rc') { exclude group: 'org.apache.httpcomponents', module: 'httpclient' } diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index bf56f4710..3e1d32ba5 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -1,11 +1,10 @@ - - - - @@ -100,6 +99,8 @@ android:name="android.hardware.touchscreen" android:required="false" /> + + + + 0) { - if (!pickerDialog.hasTime()) { - Date d = newDate(date); - d.setHours(18); - d.setMinutes(0); - d.setSeconds(0); - date = d.getTime(); - } - v.setTag(date); - TextView label = (TextView) v.findViewById(R.id.alarm_string); - label.setText(DateAndTimePicker.getDisplayString(activity, date)); - } + public void onDateTimePicked(DateTime dateTime) { + v.setTag(dateTime.getMillis()); + TextView label = (TextView) v.findViewById(R.id.alarm_string); + label.setText(getDisplayString(activity, dateTime.getMillis())); } - + }, new DialogInterface.OnDismissListener() { @Override - public void onDateAndTimeCancelled() { - // Do nothing + public void onDismiss(DialogInterface dialog) { } }); - pickerDialog.show(); } }); alertItem.setTag(alert.getTime()); TextView display = (TextView) alertItem.findViewById(R.id.alarm_string); - display.setText(DateAndTimePicker.getDisplayString(activity, alert.getTime())); + display.setText(getDisplayString(activity, alert.getTime())); ImageButton reminderRemoveButton; reminderRemoveButton = (ImageButton)alertItem.findViewById(R.id.button1); @@ -146,4 +124,13 @@ public final class AlarmControlSet extends TaskEditControlSetBase { } }); } + + public static String getDisplayString(Context context, long forDate) { + DateTime dateTime = newDateTime(forDate); + Date d = dateTime.toDate(); + return (dateTime.getYear() == newDateTime().getYear() + ? DateUtilities.getDateStringHideYear(d) + : DateUtilities.getDateString(d)) + + ", " + DateUtilities.getTimeString(context, d); + } } diff --git a/src/main/java/com/todoroo/astrid/reminders/ReminderPreferences.java b/src/main/java/com/todoroo/astrid/reminders/ReminderPreferences.java index 5328c7653..d78ddc2af 100644 --- a/src/main/java/com/todoroo/astrid/reminders/ReminderPreferences.java +++ b/src/main/java/com/todoroo/astrid/reminders/ReminderPreferences.java @@ -5,6 +5,7 @@ */ package com.todoroo.astrid.reminders; +import android.content.Intent; import android.media.Ringtone; import android.media.RingtoneManager; import android.net.Uri; @@ -14,15 +15,18 @@ import android.preference.PreferenceManager; import org.joda.time.DateTime; import org.tasks.R; +import org.tasks.activities.TimePickerActivity; import org.tasks.injection.InjectingPreferenceActivity; import org.tasks.ui.TimePreference; -import java.text.DateFormat; - import static com.todoroo.andlib.utility.AndroidUtilities.preJellybean; public class ReminderPreferences extends InjectingPreferenceActivity { + private static final int REQUEST_QUIET_START = 10001; + private static final int REQUEST_QUIET_END = 10002; + private static final int REQUEST_DEFAULT_REMIND = 10003; + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -34,26 +38,23 @@ public class ReminderPreferences extends InjectingPreferenceActivity { } initializeRingtonePreference(); - initializeTimePreference(R.string.p_rmd_time, R.string.rmd_EPr_rmd_time_desc); - initializeTimePreference(R.string.p_rmd_quietStart, null); - initializeTimePreference(R.string.p_rmd_quietEnd, null); + initializeTimePreference(getDefaultRemindTimePreference(), REQUEST_DEFAULT_REMIND); + initializeTimePreference(getQuietStartPreference(), REQUEST_QUIET_START); + initializeTimePreference(getQuietEndPreference(), REQUEST_QUIET_END); } - private void initializeTimePreference(int key, final Integer summaryRes) { - Preference preference = findPreference(getString(key)); - preference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + private void initializeTimePreference(final TimePreference preference, final int requestCode) { + preference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - setPreference(preference, summaryRes, (int) newValue); + public boolean onPreferenceClick(Preference ignored) { + final DateTime current = new DateTime().withMillisOfDay(preference.getMillisOfDay()); + startActivityForResult(new Intent(ReminderPreferences.this, TimePickerActivity.class) {{ + putExtra(TimePickerActivity.EXTRA_HOURS, current.getHourOfDay()); + putExtra(TimePickerActivity.EXTRA_MINUTES, current.getMinuteOfHour()); + }}, requestCode); return true; } }); - setPreference(preference, summaryRes, ((TimePreference) preference).getMillisOfDay()); - } - - private void setPreference(Preference preference, final Integer summaryRes, int millisOfDay) { - String setting = DateFormat.getTimeInstance(DateFormat.SHORT).format(new DateTime().withMillisOfDay(millisOfDay).toDate()); - preference.setSummary(summaryRes == null ? setting : getString(summaryRes, setting)); } private void initializeRingtonePreference() { @@ -79,4 +80,38 @@ public class ReminderPreferences extends InjectingPreferenceActivity { ringtoneChangedListener.onPreferenceChange(ringtonePreference, PreferenceManager.getDefaultSharedPreferences(this) .getString(ringtoneKey, null)); } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (resultCode == RESULT_OK) { + switch (requestCode) { + case REQUEST_QUIET_START: + getQuietStartPreference().handleTimePickerActivityIntent(data); + return; + case REQUEST_QUIET_END: + getQuietEndPreference().handleTimePickerActivityIntent(data); + return; + case REQUEST_DEFAULT_REMIND: + getDefaultRemindTimePreference().handleTimePickerActivityIntent(data); + return; + } + } + super.onActivityResult(requestCode, resultCode, data); + } + + private TimePreference getQuietStartPreference() { + return getTimePreference(R.string.p_rmd_quietStart); + } + + private TimePreference getQuietEndPreference() { + return getTimePreference(R.string.p_rmd_quietEnd); + } + + private TimePreference getDefaultRemindTimePreference() { + return getTimePreference(R.string.p_rmd_time); + } + + private TimePreference getTimePreference(int resId) { + return (TimePreference) findPreference(getString(resId)); + } } diff --git a/src/main/java/com/todoroo/astrid/repeats/RepeatControlSet.java b/src/main/java/com/todoroo/astrid/repeats/RepeatControlSet.java index 824f66ce2..1ce93d9ba 100644 --- a/src/main/java/com/todoroo/astrid/repeats/RepeatControlSet.java +++ b/src/main/java/com/todoroo/astrid/repeats/RepeatControlSet.java @@ -110,7 +110,7 @@ public class RepeatControlSet extends PopupControlSet { if (newValue == 0) { repeatUntil.setText(activity.getString(R.string.repeat_forever)); } else { - repeatUntil.setText(activity.getString(R.string.repeat_until, DateAndTimePicker.getDisplayString(activity, newValue))); + repeatUntil.setText(activity.getString(R.string.repeat_until, DateAndTimePicker.getDisplayString(activity, newValue, false, false))); } } @@ -137,16 +137,10 @@ public class RepeatControlSet extends PopupControlSet { public void onDateAndTimeSelected(long date) { setRepeatUntilValue(date); } - - @Override - public void onDateAndTimeCancelled() { - // - } }); d.show(); } - public void addListener(RepeatChangedListener listener) { listeners.add(listener); } diff --git a/src/main/java/com/todoroo/astrid/ui/DateAndTimeDialog.java b/src/main/java/com/todoroo/astrid/ui/DateAndTimeDialog.java index 5e5897be2..4d56995ac 100644 --- a/src/main/java/com/todoroo/astrid/ui/DateAndTimeDialog.java +++ b/src/main/java/com/todoroo/astrid/ui/DateAndTimeDialog.java @@ -20,7 +20,6 @@ public class DateAndTimeDialog extends Dialog { public interface DateAndTimeDialogListener { public void onDateAndTimeSelected(long date); - public void onDateAndTimeCancelled(); } private final DateAndTimePicker dateAndTimePicker; @@ -28,10 +27,6 @@ public class DateAndTimeDialog extends Dialog { private DateAndTimeDialogListener listener; - public DateAndTimeDialog(ActivityPreferences preferences, Context context, long startDate) { - this(preferences, context, startDate, R.layout.date_time_dialog, 0); - } - public DateAndTimeDialog(ActivityPreferences preferences, Context context, long startDate, int contentView, int title) { super(context, preferences.getEditDialogTheme()); @@ -69,9 +64,6 @@ public class DateAndTimeDialog extends Dialog { public void onClick(View v) { cancelled = true; cancel(); - if (listener != null) { - listener.onDateAndTimeCancelled(); - } } }); @@ -89,14 +81,6 @@ public class DateAndTimeDialog extends Dialog { }); } - public void setSelectedDateAndTime(long date) { - dateAndTimePicker.initializeWithDate(date); - } - - public boolean hasTime() { - return dateAndTimePicker.hasTime(); - } - public void setDateAndTimeDialogListener(DateAndTimeDialogListener listener) { this.listener = listener; } diff --git a/src/main/java/com/todoroo/astrid/ui/DateAndTimePicker.java b/src/main/java/com/todoroo/astrid/ui/DateAndTimePicker.java index bf88b006e..df7aa3125 100644 --- a/src/main/java/com/todoroo/astrid/ui/DateAndTimePicker.java +++ b/src/main/java/com/todoroo/astrid/ui/DateAndTimePicker.java @@ -234,10 +234,6 @@ public class DateAndTimePicker extends LinearLayout { return calendarDate.getTime(); } - public boolean hasTime() { - return timePicker.hasTime(); - } - public boolean isAfterNow() { long dueDate = constructDueDate(); return dueDate > DateUtilities.now(); @@ -248,10 +244,6 @@ public class DateAndTimePicker extends LinearLayout { return getDisplayString(context, dueDate, false, false); } - public static String getDisplayString(Context context, long forDate) { - return getDisplayString(context, forDate, false, false); - } - public static String getDisplayString(Context context, long forDate, boolean hideYear, boolean hideTime) { StringBuilder displayString = new StringBuilder(); Date d = newDate(forDate); diff --git a/src/main/java/com/todoroo/astrid/ui/DateChangedAlerts.java b/src/main/java/com/todoroo/astrid/ui/DateChangedAlerts.java index d9a1085ef..5d8557316 100644 --- a/src/main/java/com/todoroo/astrid/ui/DateChangedAlerts.java +++ b/src/main/java/com/todoroo/astrid/ui/DateChangedAlerts.java @@ -166,11 +166,6 @@ public class DateChangedAlerts { RepeatTaskCompleteListener.rescheduleTask(context, gcalHelper, taskService, task, newDueDate); Flags.set(Flags.REFRESH); } - - @Override - public void onDateAndTimeCancelled() { - // - } }); picker.show(); } diff --git a/src/main/java/com/todoroo/astrid/ui/HideUntilControlSet.java b/src/main/java/com/todoroo/astrid/ui/HideUntilControlSet.java index de0338049..6e017cdfb 100644 --- a/src/main/java/com/todoroo/astrid/ui/HideUntilControlSet.java +++ b/src/main/java/com/todoroo/astrid/ui/HideUntilControlSet.java @@ -5,7 +5,7 @@ */ package com.todoroo.astrid.ui; -import android.app.Activity; +import android.content.DialogInterface; import android.view.View; import android.view.View.OnClickListener; import android.widget.AdapterView; @@ -16,15 +16,18 @@ import android.widget.Spinner; import android.widget.TextView; import com.todoroo.andlib.utility.DateUtilities; +import com.todoroo.astrid.activity.TaskEditFragment; import com.todoroo.astrid.data.Task; -import com.todoroo.astrid.ui.DateAndTimeDialog.DateAndTimeDialogListener; +import org.joda.time.DateTime; import org.tasks.R; +import org.tasks.dialogs.DateAndTimePickerDialog; import org.tasks.preferences.ActivityPreferences; import java.util.Date; import static org.tasks.date.DateTimeUtils.newDate; +import static org.tasks.date.DateTimeUtils.newDateTime; /** * Control set for specifying when a task should be hidden @@ -45,9 +48,11 @@ public class HideUntilControlSet extends PopupControlSet implements OnItemSelect private int selection; private long existingDate = EXISTING_TIME_UNSET; + private TaskEditFragment taskEditFragment; - public HideUntilControlSet(ActivityPreferences preferences, Activity activity) { - super(preferences, activity, R.layout.control_set_hide_spinner, R.layout.control_set_hide, title); + public HideUntilControlSet(ActivityPreferences preferences, TaskEditFragment taskEditFragment) { + super(preferences, taskEditFragment.getActivity(), R.layout.control_set_hide_spinner, R.layout.control_set_hide, title); + this.taskEditFragment = taskEditFragment; } private ArrayAdapter adapter; @@ -120,25 +125,15 @@ public class HideUntilControlSet extends PopupControlSet implements OnItemSelect customDate = newDate(existingDate == EXISTING_TIME_UNSET ? DateUtilities.now() : existingDate); customDate.setSeconds(0); - final DateAndTimeDialog dateAndTimeDialog = new DateAndTimeDialog(preferences, activity, customDate.getTime()); - dateAndTimeDialog.show(); - dateAndTimeDialog.setDateAndTimeDialogListener(new DateAndTimeDialogListener() { + DateAndTimePickerDialog.dateAndTimePickerDialog(taskEditFragment.getFragmentManager(), taskEditFragment.getActivity(), newDateTime(customDate), new DateAndTimePickerDialog.OnDateTimePicked() { @Override - public void onDateAndTimeSelected(long date) { - if (date > 0) { - customDate = newDate(date); - if (!dateAndTimeDialog.hasTime()) { - customDate.setHours(0); - customDate.setMinutes(0); - customDate.setSeconds(0); - } - customDateFinished(); - } + public void onDateTimePicked(DateTime dateTime) { + customDate = dateTime.toDate(); + customDateFinished(); } - + }, new DialogInterface.OnDismissListener() { @Override - public void onDateAndTimeCancelled() { - // user canceled, restore previous choice + public void onDismiss(DialogInterface dialog) { spinner.setSelection(previousSetting); refreshDisplayView(); } diff --git a/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.java b/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.java index d6cd1587c..5432fa5f9 100644 --- a/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.java +++ b/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.java @@ -5,7 +5,6 @@ */ package com.todoroo.astrid.ui; -import android.app.Activity; import android.view.View; import android.view.View.OnClickListener; import android.widget.AdapterView; @@ -16,6 +15,7 @@ import android.widget.LinearLayout; import android.widget.Spinner; import android.widget.TextView; +import com.todoroo.astrid.activity.TaskEditFragment; import com.todoroo.astrid.alarms.AlarmControlSet; import com.todoroo.astrid.alarms.AlarmService; import com.todoroo.astrid.data.Task; @@ -43,11 +43,12 @@ public class ReminderControlSet extends PopupControlSet { private RandomReminderControlSet randomControlSet; private AlarmControlSet alarmControl; private final AlarmService alarmService; + private TaskEditFragment taskEditFragment; - public ReminderControlSet(ActivityPreferences preferences, AlarmService alarmService, - Activity activity) { - super(preferences, activity, R.layout.control_set_reminders_dialog, R.layout.control_set_reminders, R.string.TEA_reminders_group_label); + public ReminderControlSet(ActivityPreferences preferences, AlarmService alarmService, TaskEditFragment taskEditFragment) { + super(preferences, taskEditFragment.getActivity(), R.layout.control_set_reminders_dialog, R.layout.control_set_reminders, R.string.TEA_reminders_group_label); this.alarmService = alarmService; + this.taskEditFragment = taskEditFragment; extraViews = new ArrayList<>(); label = (TextView) getDisplayView().findViewById(R.id.display_row_edit); } @@ -109,7 +110,7 @@ public class ReminderControlSet extends PopupControlSet { }); randomControlSet = new RandomReminderControlSet(activity, getView(), -1); - alarmControl = new AlarmControlSet(preferences, alarmService, activity); + alarmControl = new AlarmControlSet(alarmService, taskEditFragment); alarmControl.readFromTask(model); remindersBody = (LinearLayout) getView().findViewById(R.id.reminders_body); diff --git a/src/main/java/org/tasks/activities/TimePickerActivity.java b/src/main/java/org/tasks/activities/TimePickerActivity.java new file mode 100644 index 000000000..e32544174 --- /dev/null +++ b/src/main/java/org/tasks/activities/TimePickerActivity.java @@ -0,0 +1,43 @@ +package org.tasks.activities; + +import android.content.DialogInterface; +import android.content.Intent; +import android.os.Bundle; +import android.support.v4.app.FragmentActivity; + +import org.joda.time.DateTime; +import org.tasks.dialogs.DateAndTimePickerDialog; + +import static org.tasks.date.DateTimeUtils.newDateTime; + +public class TimePickerActivity extends FragmentActivity { + + public static final String EXTRA_HOURS = "extra_hours"; + public static final String EXTRA_MINUTES = "extra_minutes"; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + Intent intent = getIntent(); + int hour = intent.getIntExtra(EXTRA_HOURS, 0); + int minutes = intent.getIntExtra(EXTRA_MINUTES, 0); + + DateAndTimePickerDialog.timePickerDialog(getSupportFragmentManager(), this, newDateTime().withMillisOfDay(0).withHourOfDay(hour).withMinuteOfHour(minutes), new DateAndTimePickerDialog.OnTimePicked() { + @Override + public void onTimePicked(int millisOfDay) { + final DateTime dateTime = newDateTime().withMillisOfDay(millisOfDay); + setResult(RESULT_OK, new Intent() {{ + putExtra(EXTRA_HOURS, dateTime.getHourOfDay()); + putExtra(EXTRA_MINUTES, dateTime.getMinuteOfHour()); + }}); + finish(); + } + }, new DialogInterface.OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialog) { + finish(); + } + }); + } +} diff --git a/src/main/java/org/tasks/date/DateTimeUtils.java b/src/main/java/org/tasks/date/DateTimeUtils.java index d2c92bb65..7b418edef 100644 --- a/src/main/java/org/tasks/date/DateTimeUtils.java +++ b/src/main/java/org/tasks/date/DateTimeUtils.java @@ -26,6 +26,14 @@ public class DateTimeUtils { return newDate(Date.UTC(year - 1900, month - 1, day, hour, minute, second)); } + public static DateTime newDateTime() { + return new DateTime(); + } + + public static DateTime newDateTime(Date date) { + return newDateTime(date.getTime()); + } + public static DateTime newDateTime(long timestamp) { return new DateTime(timestamp); } diff --git a/src/main/java/org/tasks/dialogs/DateAndTimePickerDialog.java b/src/main/java/org/tasks/dialogs/DateAndTimePickerDialog.java new file mode 100644 index 000000000..21ae48a62 --- /dev/null +++ b/src/main/java/org/tasks/dialogs/DateAndTimePickerDialog.java @@ -0,0 +1,78 @@ +package org.tasks.dialogs; + +import android.content.Context; +import android.content.DialogInterface; +import android.support.v4.app.FragmentManager; +import android.text.format.DateFormat; + +import com.doomonafireball.betterpickers.calendardatepicker.CalendarDatePickerDialog; +import com.doomonafireball.betterpickers.radialtimepicker.RadialTimePickerDialog; + +import org.joda.time.DateTime; + +import static org.tasks.date.DateTimeUtils.newDateTime; + +public class DateAndTimePickerDialog { + + public interface OnDatePicked { + void onDatePicked(DateTime date); + } + + public interface OnTimePicked { + void onTimePicked(int millisOfDay); + } + + public interface OnDateTimePicked { + void onDateTimePicked(DateTime dateTime); + } + + private static final String FRAG_TAG_DATE_PICKER = "frag_tag_date_picker"; + private static final String FRAG_TAG_TIME_PICKER = "frag_tag_time_picker"; + + public static void datePickerDialog(FragmentManager fragmentManager, DateTime initial, final OnDatePicked onDatePicked, final DialogInterface.OnDismissListener onDismissListener) { + MyCalendarDatePickerDialog dialog = new MyCalendarDatePickerDialog(); + dialog.setOnDismissListener(onDismissListener); + dialog.initialize(new CalendarDatePickerDialog.OnDateSetListener() { + @Override + public void onDateSet(CalendarDatePickerDialog calendarDatePickerDialog, int year, int month, int day) { + onDatePicked.onDatePicked(newDateTime().withYear(year).withMonthOfYear(month + 1).withDayOfMonth(day).withMillisOfDay(0)); + } + }, initial.getYear(), initial.getMonthOfYear() - 1, initial.getDayOfMonth()); + dialog.show(fragmentManager, FRAG_TAG_DATE_PICKER); + } + + public static void timePickerDialog(FragmentManager fragmentManager, Context context, DateTime initial, final OnTimePicked onTimePicked, final DialogInterface.OnDismissListener onDismissListener) { + final boolean[] success = new boolean[1]; + RadialTimePickerDialog dialog = new RadialTimePickerDialog(); + dialog.initialize(new RadialTimePickerDialog.OnTimeSetListener() { + @Override + public void onTimeSet(RadialTimePickerDialog radialTimePickerDialog, int hours, int minutes) { + success[0] = true; + onTimePicked.onTimePicked(newDateTime().withMillisOfDay(0).withHourOfDay(hours).withMinuteOfHour(minutes).getMillisOfDay()); + } + }, initial.getHourOfDay(), initial.getMinuteOfHour(), DateFormat.is24HourFormat(context)); + dialog.setOnDismissListener(new RadialTimePickerDialog.OnDialogDismissListener() { + @Override + public void onDialogDismiss(DialogInterface dialogInterface) { + if (!success[0]) { + onDismissListener.onDismiss(dialogInterface); + } + } + }); + dialog.show(fragmentManager, FRAG_TAG_TIME_PICKER); + } + + public static void dateAndTimePickerDialog(final FragmentManager fragmentManager, final Context context, final DateTime dateTime, final OnDateTimePicked dateTimePicked, final DialogInterface.OnDismissListener dismissed) { + datePickerDialog(fragmentManager, dateTime, new OnDatePicked() { + @Override + public void onDatePicked(final DateTime date) { + timePickerDialog(fragmentManager, context, dateTime, new OnTimePicked() { + @Override + public void onTimePicked(int millisOfDay) { + dateTimePicked.onDateTimePicked(date.withMillisOfDay(millisOfDay)); + } + }, dismissed); + } + }, dismissed); + } +} diff --git a/src/main/java/org/tasks/dialogs/MyCalendarDatePickerDialog.java b/src/main/java/org/tasks/dialogs/MyCalendarDatePickerDialog.java new file mode 100644 index 000000000..c5979ed9e --- /dev/null +++ b/src/main/java/org/tasks/dialogs/MyCalendarDatePickerDialog.java @@ -0,0 +1,21 @@ +package org.tasks.dialogs; + +import android.content.DialogInterface; + +import com.doomonafireball.betterpickers.calendardatepicker.CalendarDatePickerDialog; + +public class MyCalendarDatePickerDialog extends CalendarDatePickerDialog { + + private DialogInterface.OnDismissListener listener; + + public void setOnDismissListener(DialogInterface.OnDismissListener listener) { + this.listener = listener; + } + + @Override + public void onCancel(DialogInterface dialog) { + if (listener != null) { + listener.onDismiss(dialog); + } + } +} diff --git a/src/main/java/org/tasks/ui/TimePreference.java b/src/main/java/org/tasks/ui/TimePreference.java index 949157199..e03252490 100644 --- a/src/main/java/org/tasks/ui/TimePreference.java +++ b/src/main/java/org/tasks/ui/TimePreference.java @@ -1,72 +1,30 @@ package org.tasks.ui; import android.content.Context; +import android.content.Intent; import android.content.res.TypedArray; -import android.preference.DialogPreference; -import android.text.format.DateFormat; +import android.preference.Preference; import android.util.AttributeSet; -import android.view.View; -import android.widget.TimePicker; import org.joda.time.DateTime; +import org.tasks.R; +import org.tasks.activities.TimePickerActivity; -public class TimePreference extends DialogPreference { +import java.text.DateFormat; + +import static org.tasks.date.DateTimeUtils.newDateTime; + +public class TimePreference extends Preference { private int millisOfDay; - private TimePicker picker = null; - private int defaultFocusability; + private String summary; public TimePreference(Context context, AttributeSet attrs) { super(context, attrs); - setPositiveButtonText(android.R.string.ok); - setNegativeButtonText(android.R.string.cancel); - } - - @Override - public View onCreateDialogView() { - picker = new TimePicker(getContext()); - defaultFocusability = picker.getDescendantFocusability(); - refreshPicker(); - return picker; - } - - @Override - public void onBindDialogView(View v) { - super.onBindDialogView(v); - - refreshPicker(); - } - - private void refreshPicker() { - DateTime dateTime = DateTime.now().withMillisOfDay(millisOfDay); - picker.setCurrentHour(dateTime.getHourOfDay()); - picker.setCurrentMinute(dateTime.getMinuteOfHour()); - picker.setIs24HourView(DateFormat.is24HourFormat(getContext())); - if(picker.is24HourView()) { - // Disable keyboard input on time picker to avoid this: - // https://code.google.com/p/android/issues/detail?id=24387 - picker.setDescendantFocusability(TimePicker.FOCUS_BLOCK_DESCENDANTS); - } else { - picker.setDescendantFocusability(defaultFocusability); - } - } - - @Override - public void onDialogClosed(boolean positiveResult) { - super.onDialogClosed(positiveResult); - if (positiveResult) { - picker.clearFocus(); - millisOfDay = new DateTime() - .withMillisOfDay(0) - .withHourOfDay(picker.getCurrentHour()) - .withMinuteOfHour(picker.getCurrentMinute()) - .getMillisOfDay(); - - if (callChangeListener(millisOfDay)) { - persistInt(millisOfDay); - } - } + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TimePreference); + summary = a.getString(R.styleable.TimePreference_summary); + a.recycle(); } @Override @@ -78,14 +36,31 @@ public class TimePreference extends DialogPreference { public void onSetInitialValue(boolean restoreValue, Object defaultValue) { if (restoreValue) { int noon = new DateTime().withMillisOfDay(0).withHourOfDay(12).getMillisOfDay(); - int persistedString = getPersistedInt(noon); - millisOfDay = persistedString; + millisOfDay = getPersistedInt(noon); } else { millisOfDay = Integer.parseInt((String) defaultValue); } + + setMillisOfDay(millisOfDay); } public int getMillisOfDay() { return millisOfDay; } + + public void handleTimePickerActivityIntent(Intent data) { + int hour = data.getIntExtra(TimePickerActivity.EXTRA_HOURS, 0); + int minute = data.getIntExtra(TimePickerActivity.EXTRA_MINUTES, 0); + int millisOfDay = newDateTime().withMillisOfDay(0).withHourOfDay(hour).withMinuteOfHour(minute).getMillisOfDay(); + if (callChangeListener(millisOfDay)) { + persistInt(millisOfDay); + setMillisOfDay(millisOfDay); + } + } + + private void setMillisOfDay(int millisOfDay) { + this.millisOfDay = millisOfDay; + String setting = DateFormat.getTimeInstance(DateFormat.SHORT).format(new DateTime().withMillisOfDay(millisOfDay).toDate()); + setSummary(summary == null ? setting : String.format(summary, setting)); + } } diff --git a/src/main/res/values/attrs.xml b/src/main/res/values/attrs.xml index c22fffa14..588d3f690 100644 --- a/src/main/res/values/attrs.xml +++ b/src/main/res/values/attrs.xml @@ -60,4 +60,8 @@ + + + + diff --git a/src/main/res/values/styles.xml b/src/main/res/values/styles.xml index 76c0d6712..143ce93f4 100644 --- a/src/main/res/values/styles.xml +++ b/src/main/res/values/styles.xml @@ -270,4 +270,10 @@ 18sp +