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 ("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'
}

@ -1,11 +1,10 @@
<?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">
<!-- widgets, alarms, and services will break if Astrid is installed on SD card -->
<!-- android:installLocation="internalOnly"> -->
<!-- ================================================== Used Permissions = -->
<!-- **************** -->
@ -100,6 +99,8 @@
android:name="android.hardware.touchscreen"
android:required="false" />
<uses-sdk tools:overrideLibrary="com.doomonafireball.betterpickers"/>
<application
android:icon="@drawable/icon"
android:label="@string/app_name"
@ -111,6 +112,10 @@
<!-- ====================================================== Activities = -->
<activity
android:name=".activities.TimePickerActivity"
android:theme="@style/Tasks.Dialog" />
<!-- Activity that displays task list -->
<activity
android:name="com.todoroo.astrid.activity.TaskListActivity"

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

@ -5,7 +5,8 @@
*/
package com.todoroo.astrid.alarms;
import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
@ -15,20 +16,20 @@ import android.widget.TextView;
import com.todoroo.andlib.data.Callback;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.activity.TaskEditFragment;
import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.Task;
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.preferences.ActivityPreferences;
import org.tasks.dialogs.DateAndTimePickerDialog;
import java.util.Date;
import java.util.LinkedHashSet;
import static org.tasks.date.DateTimeUtils.newDate;
import static org.tasks.date.DateTimeUtils.newDateTime;
/**
* 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 {
private final ActivityPreferences preferences;
private final AlarmService alarmService;
private TaskEditFragment taskEditFragment;
private LinearLayout alertsContainer;
private DateAndTimeDialog pickerDialog;
public AlarmControlSet(ActivityPreferences preferences, AlarmService alarmService, Activity activity) {
super(activity, R.layout.control_set_alarms);
this.preferences = preferences;
public AlarmControlSet(AlarmService alarmService, TaskEditFragment taskEditFragment) {
super(taskEditFragment.getActivity(), R.layout.control_set_alarms);
this.alarmService = alarmService;
this.taskEditFragment = taskEditFragment;
}
@Override
@ -71,16 +71,6 @@ public final class AlarmControlSet extends TaskEditControlSetBase {
}
};
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
@ -106,36 +96,24 @@ public final class AlarmControlSet extends TaskEditControlSetBase {
alertItem.setOnClickListener(new OnClickListener() {
@Override
public void onClick(final View v) {
pickerDialog.setSelectedDateAndTime((Long) alertItem.getTag());
pickerDialog.setDateAndTimeDialogListener(new DateAndTimeDialogListener() {
DateAndTimePickerDialog.dateAndTimePickerDialog(taskEditFragment.getFragmentManager(), taskEditFragment.getActivity(), newDateTime((Long) alertItem.getTag()), new DateAndTimePickerDialog.OnDateTimePicked() {
@Override
public void onDateAndTimeSelected(long date) {
if (date > 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);
}
}

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

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

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

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

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

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

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

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

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

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

@ -270,4 +270,10 @@
<item name="android:textSize">18sp</item>
</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>

@ -3,7 +3,9 @@
**
** 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">
<CheckBoxPreference
@ -40,7 +42,8 @@
android:defaultValue="@integer/default_remind_time"
android:dependency="@string/p_rmd_enabled"
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
android:defaultValue="false"
android:dependency="@string/p_rmd_enabled"

Loading…
Cancel
Save