Use betterpickers calendar and radial pickers

* TimePreference
* Custom alarms
* Custom HideUntil dates
pull/281/head
Alex Baker 11 years ago
parent 1c35c38319
commit f42d5013f3

@ -91,6 +91,11 @@ dependencies {
compile group: 'net.i2p.android.ext', name: 'floatingactionbutton', version: '1.8.0' 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') { compile(group: 'com.google.apis', name: 'google-api-services-tasks', version: 'v1-rev33-1.18.0-rc') {
exclude group: 'org.apache.httpcomponents', module: 'httpclient' exclude group: 'org.apache.httpcomponents', module: 'httpclient'
} }

@ -1,11 +1,10 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="org.tasks"> package="org.tasks">
<!-- widgets, alarms, and services will break if Astrid is installed on SD card -->
<!-- android:installLocation="internalOnly"> -->
<!-- ================================================== Used Permissions = --> <!-- ================================================== Used Permissions = -->
<!-- **************** --> <!-- **************** -->
@ -100,6 +99,8 @@
android:name="android.hardware.touchscreen" android:name="android.hardware.touchscreen"
android:required="false" /> android:required="false" />
<uses-sdk tools:overrideLibrary="com.doomonafireball.betterpickers"/>
<application <application
android:icon="@drawable/icon" android:icon="@drawable/icon"
android:label="@string/app_name" android:label="@string/app_name"
@ -111,6 +112,10 @@
<!-- ====================================================== Activities = --> <!-- ====================================================== Activities = -->
<activity
android:name=".activities.TimePickerActivity"
android:theme="@style/Tasks.Dialog" />
<!-- Activity that displays task list --> <!-- Activity that displays task list -->
<activity <activity
android:name="com.todoroo.astrid.activity.TaskListActivity" android:name="com.todoroo.astrid.activity.TaskListActivity"

@ -389,12 +389,12 @@ ViewPager.OnPageChangeListener, EditNoteActivity.UpdatesChangedListener {
controlSetMap.put(getString(R.string.TEA_ctrl_notes_pref), controlSetMap.put(getString(R.string.TEA_ctrl_notes_pref),
notesControlSet); notesControlSet);
ReminderControlSet reminderControl = new ReminderControlSet(preferences, alarmService, getActivity()); ReminderControlSet reminderControl = new ReminderControlSet(preferences, alarmService, this);
controls.add(reminderControl); controls.add(reminderControl);
controlSetMap.put(getString(R.string.TEA_ctrl_reminders_pref), controlSetMap.put(getString(R.string.TEA_ctrl_reminders_pref),
reminderControl); reminderControl);
HideUntilControlSet hideUntilControls = new HideUntilControlSet(preferences, getActivity()); HideUntilControlSet hideUntilControls = new HideUntilControlSet(preferences, this);
controls.add(hideUntilControls); controls.add(hideUntilControls);
controlSetMap.put(getString(R.string.TEA_ctrl_hide_until_pref), hideUntilControls); controlSetMap.put(getString(R.string.TEA_ctrl_hide_until_pref), hideUntilControls);

@ -5,7 +5,8 @@
*/ */
package com.todoroo.astrid.alarms; package com.todoroo.astrid.alarms;
import android.app.Activity; import android.content.Context;
import android.content.DialogInterface;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
@ -15,20 +16,20 @@ import android.widget.TextView;
import com.todoroo.andlib.data.Callback; import com.todoroo.andlib.data.Callback;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.activity.TaskEditFragment;
import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.helper.TaskEditControlSetBase; import com.todoroo.astrid.helper.TaskEditControlSetBase;
import com.todoroo.astrid.ui.DateAndTimeDialog;
import com.todoroo.astrid.ui.DateAndTimeDialog.DateAndTimeDialogListener;
import com.todoroo.astrid.ui.DateAndTimePicker;
import org.joda.time.DateTime;
import org.tasks.R; import org.tasks.R;
import org.tasks.preferences.ActivityPreferences; import org.tasks.dialogs.DateAndTimePickerDialog;
import java.util.Date; import java.util.Date;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import static org.tasks.date.DateTimeUtils.newDate; import static org.tasks.date.DateTimeUtils.newDate;
import static org.tasks.date.DateTimeUtils.newDateTime;
/** /**
* Control set to manage adding and removing tags * Control set to manage adding and removing tags
@ -38,16 +39,15 @@ import static org.tasks.date.DateTimeUtils.newDate;
*/ */
public final class AlarmControlSet extends TaskEditControlSetBase { public final class AlarmControlSet extends TaskEditControlSetBase {
private final ActivityPreferences preferences;
private final AlarmService alarmService; private final AlarmService alarmService;
private TaskEditFragment taskEditFragment;
private LinearLayout alertsContainer; private LinearLayout alertsContainer;
private DateAndTimeDialog pickerDialog;
public AlarmControlSet(ActivityPreferences preferences, AlarmService alarmService, Activity activity) { public AlarmControlSet(AlarmService alarmService, TaskEditFragment taskEditFragment) {
super(activity, R.layout.control_set_alarms); super(taskEditFragment.getActivity(), R.layout.control_set_alarms);
this.preferences = preferences;
this.alarmService = alarmService; this.alarmService = alarmService;
this.taskEditFragment = taskEditFragment;
} }
@Override @Override
@ -71,16 +71,6 @@ public final class AlarmControlSet extends TaskEditControlSetBase {
} }
}; };
getView().findViewById(R.id.alarms_add).setOnClickListener(addAlarmListener); getView().findViewById(R.id.alarms_add).setOnClickListener(addAlarmListener);
pickerDialog = new DateAndTimeDialog(preferences, activity, 0);
}
@Override
public void writeToModel(Task task) {
if (initialized && pickerDialog != null) {
pickerDialog.dismiss();
}
super.writeToModel(task);
} }
@Override @Override
@ -106,36 +96,24 @@ public final class AlarmControlSet extends TaskEditControlSetBase {
alertItem.setOnClickListener(new OnClickListener() { alertItem.setOnClickListener(new OnClickListener() {
@Override @Override
public void onClick(final View v) { public void onClick(final View v) {
pickerDialog.setSelectedDateAndTime((Long) alertItem.getTag()); DateAndTimePickerDialog.dateAndTimePickerDialog(taskEditFragment.getFragmentManager(), taskEditFragment.getActivity(), newDateTime((Long) alertItem.getTag()), new DateAndTimePickerDialog.OnDateTimePicked() {
pickerDialog.setDateAndTimeDialogListener(new DateAndTimeDialogListener() {
@Override @Override
public void onDateAndTimeSelected(long date) { public void onDateTimePicked(DateTime dateTime) {
if (date > 0) { v.setTag(dateTime.getMillis());
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); TextView label = (TextView) v.findViewById(R.id.alarm_string);
label.setText(DateAndTimePicker.getDisplayString(activity, date)); label.setText(getDisplayString(activity, dateTime.getMillis()));
} }
} }, new DialogInterface.OnDismissListener() {
@Override @Override
public void onDateAndTimeCancelled() { public void onDismiss(DialogInterface dialog) {
// Do nothing
} }
}); });
pickerDialog.show();
} }
}); });
alertItem.setTag(alert.getTime()); alertItem.setTag(alert.getTime());
TextView display = (TextView) alertItem.findViewById(R.id.alarm_string); TextView display = (TextView) alertItem.findViewById(R.id.alarm_string);
display.setText(DateAndTimePicker.getDisplayString(activity, alert.getTime())); display.setText(getDisplayString(activity, alert.getTime()));
ImageButton reminderRemoveButton; ImageButton reminderRemoveButton;
reminderRemoveButton = (ImageButton)alertItem.findViewById(R.id.button1); 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);
}
} }

@ -5,6 +5,7 @@
*/ */
package com.todoroo.astrid.reminders; package com.todoroo.astrid.reminders;
import android.content.Intent;
import android.media.Ringtone; import android.media.Ringtone;
import android.media.RingtoneManager; import android.media.RingtoneManager;
import android.net.Uri; import android.net.Uri;
@ -14,15 +15,18 @@ import android.preference.PreferenceManager;
import org.joda.time.DateTime; import org.joda.time.DateTime;
import org.tasks.R; import org.tasks.R;
import org.tasks.activities.TimePickerActivity;
import org.tasks.injection.InjectingPreferenceActivity; import org.tasks.injection.InjectingPreferenceActivity;
import org.tasks.ui.TimePreference; import org.tasks.ui.TimePreference;
import java.text.DateFormat;
import static com.todoroo.andlib.utility.AndroidUtilities.preJellybean; import static com.todoroo.andlib.utility.AndroidUtilities.preJellybean;
public class ReminderPreferences extends InjectingPreferenceActivity { 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 @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
@ -34,26 +38,23 @@ public class ReminderPreferences extends InjectingPreferenceActivity {
} }
initializeRingtonePreference(); initializeRingtonePreference();
initializeTimePreference(R.string.p_rmd_time, R.string.rmd_EPr_rmd_time_desc); initializeTimePreference(getDefaultRemindTimePreference(), REQUEST_DEFAULT_REMIND);
initializeTimePreference(R.string.p_rmd_quietStart, null); initializeTimePreference(getQuietStartPreference(), REQUEST_QUIET_START);
initializeTimePreference(R.string.p_rmd_quietEnd, null); initializeTimePreference(getQuietEndPreference(), REQUEST_QUIET_END);
} }
private void initializeTimePreference(int key, final Integer summaryRes) { private void initializeTimePreference(final TimePreference preference, final int requestCode) {
Preference preference = findPreference(getString(key)); preference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
preference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override @Override
public boolean onPreferenceChange(Preference preference, Object newValue) { public boolean onPreferenceClick(Preference ignored) {
setPreference(preference, summaryRes, (int) newValue); 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; 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() { private void initializeRingtonePreference() {
@ -79,4 +80,38 @@ public class ReminderPreferences extends InjectingPreferenceActivity {
ringtoneChangedListener.onPreferenceChange(ringtonePreference, PreferenceManager.getDefaultSharedPreferences(this) ringtoneChangedListener.onPreferenceChange(ringtonePreference, PreferenceManager.getDefaultSharedPreferences(this)
.getString(ringtoneKey, null)); .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));
}
} }

@ -110,7 +110,7 @@ public class RepeatControlSet extends PopupControlSet {
if (newValue == 0) { if (newValue == 0) {
repeatUntil.setText(activity.getString(R.string.repeat_forever)); repeatUntil.setText(activity.getString(R.string.repeat_forever));
} else { } 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) { public void onDateAndTimeSelected(long date) {
setRepeatUntilValue(date); setRepeatUntilValue(date);
} }
@Override
public void onDateAndTimeCancelled() {
//
}
}); });
d.show(); d.show();
} }
public void addListener(RepeatChangedListener listener) { public void addListener(RepeatChangedListener listener) {
listeners.add(listener); listeners.add(listener);
} }

@ -20,7 +20,6 @@ public class DateAndTimeDialog extends Dialog {
public interface DateAndTimeDialogListener { public interface DateAndTimeDialogListener {
public void onDateAndTimeSelected(long date); public void onDateAndTimeSelected(long date);
public void onDateAndTimeCancelled();
} }
private final DateAndTimePicker dateAndTimePicker; private final DateAndTimePicker dateAndTimePicker;
@ -28,10 +27,6 @@ public class DateAndTimeDialog extends Dialog {
private DateAndTimeDialogListener listener; 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) { public DateAndTimeDialog(ActivityPreferences preferences, Context context, long startDate, int contentView, int title) {
super(context, preferences.getEditDialogTheme()); super(context, preferences.getEditDialogTheme());
@ -69,9 +64,6 @@ public class DateAndTimeDialog extends Dialog {
public void onClick(View v) { public void onClick(View v) {
cancelled = true; cancelled = true;
cancel(); 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) { public void setDateAndTimeDialogListener(DateAndTimeDialogListener listener) {
this.listener = listener; this.listener = listener;
} }

@ -234,10 +234,6 @@ public class DateAndTimePicker extends LinearLayout {
return calendarDate.getTime(); return calendarDate.getTime();
} }
public boolean hasTime() {
return timePicker.hasTime();
}
public boolean isAfterNow() { public boolean isAfterNow() {
long dueDate = constructDueDate(); long dueDate = constructDueDate();
return dueDate > DateUtilities.now(); return dueDate > DateUtilities.now();
@ -248,10 +244,6 @@ public class DateAndTimePicker extends LinearLayout {
return getDisplayString(context, dueDate, false, false); 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) { public static String getDisplayString(Context context, long forDate, boolean hideYear, boolean hideTime) {
StringBuilder displayString = new StringBuilder(); StringBuilder displayString = new StringBuilder();
Date d = newDate(forDate); Date d = newDate(forDate);

@ -166,11 +166,6 @@ public class DateChangedAlerts {
RepeatTaskCompleteListener.rescheduleTask(context, gcalHelper, taskService, task, newDueDate); RepeatTaskCompleteListener.rescheduleTask(context, gcalHelper, taskService, task, newDueDate);
Flags.set(Flags.REFRESH); Flags.set(Flags.REFRESH);
} }
@Override
public void onDateAndTimeCancelled() {
//
}
}); });
picker.show(); picker.show();
} }

@ -5,7 +5,7 @@
*/ */
package com.todoroo.astrid.ui; package com.todoroo.astrid.ui;
import android.app.Activity; import android.content.DialogInterface;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
import android.widget.AdapterView; import android.widget.AdapterView;
@ -16,15 +16,18 @@ import android.widget.Spinner;
import android.widget.TextView; import android.widget.TextView;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.activity.TaskEditFragment;
import com.todoroo.astrid.data.Task; 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.R;
import org.tasks.dialogs.DateAndTimePickerDialog;
import org.tasks.preferences.ActivityPreferences; import org.tasks.preferences.ActivityPreferences;
import java.util.Date; import java.util.Date;
import static org.tasks.date.DateTimeUtils.newDate; import static org.tasks.date.DateTimeUtils.newDate;
import static org.tasks.date.DateTimeUtils.newDateTime;
/** /**
* Control set for specifying when a task should be hidden * 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 int selection;
private long existingDate = EXISTING_TIME_UNSET; private long existingDate = EXISTING_TIME_UNSET;
private TaskEditFragment taskEditFragment;
public HideUntilControlSet(ActivityPreferences preferences, Activity activity) { public HideUntilControlSet(ActivityPreferences preferences, TaskEditFragment taskEditFragment) {
super(preferences, activity, R.layout.control_set_hide_spinner, R.layout.control_set_hide, title); super(preferences, taskEditFragment.getActivity(), R.layout.control_set_hide_spinner, R.layout.control_set_hide, title);
this.taskEditFragment = taskEditFragment;
} }
private ArrayAdapter<HideUntilValue> adapter; private ArrayAdapter<HideUntilValue> adapter;
@ -120,25 +125,15 @@ public class HideUntilControlSet extends PopupControlSet implements OnItemSelect
customDate = newDate(existingDate == EXISTING_TIME_UNSET ? DateUtilities.now() : existingDate); customDate = newDate(existingDate == EXISTING_TIME_UNSET ? DateUtilities.now() : existingDate);
customDate.setSeconds(0); customDate.setSeconds(0);
final DateAndTimeDialog dateAndTimeDialog = new DateAndTimeDialog(preferences, activity, customDate.getTime()); DateAndTimePickerDialog.dateAndTimePickerDialog(taskEditFragment.getFragmentManager(), taskEditFragment.getActivity(), newDateTime(customDate), new DateAndTimePickerDialog.OnDateTimePicked() {
dateAndTimeDialog.show();
dateAndTimeDialog.setDateAndTimeDialogListener(new DateAndTimeDialogListener() {
@Override @Override
public void onDateAndTimeSelected(long date) { public void onDateTimePicked(DateTime dateTime) {
if (date > 0) { customDate = dateTime.toDate();
customDate = newDate(date);
if (!dateAndTimeDialog.hasTime()) {
customDate.setHours(0);
customDate.setMinutes(0);
customDate.setSeconds(0);
}
customDateFinished(); customDateFinished();
} }
} }, new DialogInterface.OnDismissListener() {
@Override @Override
public void onDateAndTimeCancelled() { public void onDismiss(DialogInterface dialog) {
// user canceled, restore previous choice
spinner.setSelection(previousSetting); spinner.setSelection(previousSetting);
refreshDisplayView(); refreshDisplayView();
} }

@ -5,7 +5,6 @@
*/ */
package com.todoroo.astrid.ui; package com.todoroo.astrid.ui;
import android.app.Activity;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
import android.widget.AdapterView; import android.widget.AdapterView;
@ -16,6 +15,7 @@ import android.widget.LinearLayout;
import android.widget.Spinner; import android.widget.Spinner;
import android.widget.TextView; import android.widget.TextView;
import com.todoroo.astrid.activity.TaskEditFragment;
import com.todoroo.astrid.alarms.AlarmControlSet; import com.todoroo.astrid.alarms.AlarmControlSet;
import com.todoroo.astrid.alarms.AlarmService; import com.todoroo.astrid.alarms.AlarmService;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
@ -43,11 +43,12 @@ public class ReminderControlSet extends PopupControlSet {
private RandomReminderControlSet randomControlSet; private RandomReminderControlSet randomControlSet;
private AlarmControlSet alarmControl; private AlarmControlSet alarmControl;
private final AlarmService alarmService; private final AlarmService alarmService;
private TaskEditFragment taskEditFragment;
public ReminderControlSet(ActivityPreferences preferences, AlarmService alarmService, public ReminderControlSet(ActivityPreferences preferences, AlarmService alarmService, TaskEditFragment taskEditFragment) {
Activity activity) { super(preferences, taskEditFragment.getActivity(), R.layout.control_set_reminders_dialog, R.layout.control_set_reminders, R.string.TEA_reminders_group_label);
super(preferences, activity, R.layout.control_set_reminders_dialog, R.layout.control_set_reminders, R.string.TEA_reminders_group_label);
this.alarmService = alarmService; this.alarmService = alarmService;
this.taskEditFragment = taskEditFragment;
extraViews = new ArrayList<>(); extraViews = new ArrayList<>();
label = (TextView) getDisplayView().findViewById(R.id.display_row_edit); label = (TextView) getDisplayView().findViewById(R.id.display_row_edit);
} }
@ -109,7 +110,7 @@ public class ReminderControlSet extends PopupControlSet {
}); });
randomControlSet = new RandomReminderControlSet(activity, getView(), -1); randomControlSet = new RandomReminderControlSet(activity, getView(), -1);
alarmControl = new AlarmControlSet(preferences, alarmService, activity); alarmControl = new AlarmControlSet(alarmService, taskEditFragment);
alarmControl.readFromTask(model); alarmControl.readFromTask(model);
remindersBody = (LinearLayout) getView().findViewById(R.id.reminders_body); remindersBody = (LinearLayout) getView().findViewById(R.id.reminders_body);

@ -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();
}
});
}
}

@ -26,6 +26,14 @@ public class DateTimeUtils {
return newDate(Date.UTC(year - 1900, month - 1, day, hour, minute, second)); 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) { public static DateTime newDateTime(long timestamp) {
return new DateTime(timestamp); return new DateTime(timestamp);
} }

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

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

@ -1,72 +1,30 @@
package org.tasks.ui; package org.tasks.ui;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.content.res.TypedArray; import android.content.res.TypedArray;
import android.preference.DialogPreference; import android.preference.Preference;
import android.text.format.DateFormat;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.View;
import android.widget.TimePicker;
import org.joda.time.DateTime; 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 int millisOfDay;
private TimePicker picker = null; private String summary;
private int defaultFocusability;
public TimePreference(Context context, AttributeSet attrs) { public TimePreference(Context context, AttributeSet attrs) {
super(context, attrs); super(context, attrs);
setPositiveButtonText(android.R.string.ok); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TimePreference);
setNegativeButtonText(android.R.string.cancel); summary = a.getString(R.styleable.TimePreference_summary);
} a.recycle();
@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);
}
}
} }
@Override @Override
@ -78,14 +36,31 @@ public class TimePreference extends DialogPreference {
public void onSetInitialValue(boolean restoreValue, Object defaultValue) { public void onSetInitialValue(boolean restoreValue, Object defaultValue) {
if (restoreValue) { if (restoreValue) {
int noon = new DateTime().withMillisOfDay(0).withHourOfDay(12).getMillisOfDay(); int noon = new DateTime().withMillisOfDay(0).withHourOfDay(12).getMillisOfDay();
int persistedString = getPersistedInt(noon); millisOfDay = getPersistedInt(noon);
millisOfDay = persistedString;
} else { } else {
millisOfDay = Integer.parseInt((String) defaultValue); millisOfDay = Integer.parseInt((String) defaultValue);
} }
setMillisOfDay(millisOfDay);
} }
public int getMillisOfDay() { public int getMillisOfDay() {
return millisOfDay; 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));
}
} }

@ -60,4 +60,8 @@
<attr name="shortcutLabels" format="reference"/> <attr name="shortcutLabels" format="reference"/>
</declare-styleable> </declare-styleable>
<declare-styleable name="TimePreference">
<attr name="summary" format="string"/>
</declare-styleable>
</resources> </resources>

@ -270,4 +270,10 @@
<item name="android:textSize">18sp</item> <item name="android:textSize">18sp</item>
</style> </style>
<style name="Widget"/>
<style name="Widget.Holo"/>
<style name="Widget.Holo.Light"/>
<style name="Widget.Holo.Light.CompoundButton"/>
<style name="Widget.Holo.Light.CompoundButton.Switch"/>
</resources> </resources>

@ -3,7 +3,9 @@
** **
** See the file "LICENSE" for the full license governing this code. ** See the file "LICENSE" for the full license governing this code.
--> -->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" <PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tasks="http://schemas.android.com/apk/res-auto"
android:title="@string/notifications"> android:title="@string/notifications">
<CheckBoxPreference <CheckBoxPreference
@ -40,7 +42,8 @@
android:defaultValue="@integer/default_remind_time" android:defaultValue="@integer/default_remind_time"
android:dependency="@string/p_rmd_enabled" android:dependency="@string/p_rmd_enabled"
android:key="@string/p_rmd_time" android:key="@string/p_rmd_time"
android:title="@string/rmd_EPr_rmd_time_title" /> android:title="@string/rmd_EPr_rmd_time_title"
tasks:summary="@string/rmd_EPr_rmd_time_desc" />
<com.todoroo.astrid.ui.MultilineCheckboxPreference <com.todoroo.astrid.ui.MultilineCheckboxPreference
android:defaultValue="false" android:defaultValue="false"
android:dependency="@string/p_rmd_enabled" android:dependency="@string/p_rmd_enabled"

Loading…
Cancel
Save