diff --git a/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.java b/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.java index db466ffc8..e6195739a 100755 --- a/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.java +++ b/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.java @@ -389,7 +389,7 @@ ViewPager.OnPageChangeListener, EditNoteActivity.UpdatesChangedListener { controlSetMap.put(getString(R.string.TEA_ctrl_notes_pref), notesControlSet); - ReminderControlSet reminderControl = new ReminderControlSet(preferences, alarmService, this); + ReminderControlSet reminderControl = new ReminderControlSet(alarmService, this); controls.add(reminderControl); controlSetMap.put(getString(R.string.TEA_ctrl_reminders_pref), reminderControl); diff --git a/src/main/java/com/todoroo/astrid/alarms/AlarmControlSet.java b/src/main/java/com/todoroo/astrid/alarms/AlarmControlSet.java deleted file mode 100644 index c0e555c61..000000000 --- a/src/main/java/com/todoroo/astrid/alarms/AlarmControlSet.java +++ /dev/null @@ -1,136 +0,0 @@ -/** - * Copyright (c) 2012 Todoroo Inc - * - * See the file "LICENSE" for the full license governing this code. - */ -package com.todoroo.astrid.alarms; - -import android.content.Context; -import android.content.DialogInterface; -import android.view.LayoutInflater; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.ImageButton; -import android.widget.LinearLayout; -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 org.joda.time.DateTime; -import org.tasks.R; -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 - * - * @author Tim Su - * - */ -public final class AlarmControlSet extends TaskEditControlSetBase { - - private final AlarmService alarmService; - private TaskEditFragment taskEditFragment; - - private LinearLayout alertsContainer; - - public AlarmControlSet(AlarmService alarmService, TaskEditFragment taskEditFragment) { - super(taskEditFragment.getActivity(), R.layout.control_set_alarms); - this.alarmService = alarmService; - this.taskEditFragment = taskEditFragment; - } - - @Override - public void readFromTaskOnInitialize() { - alertsContainer.removeAllViews(); - alarmService.getAlarms(model.getId(), new Callback() { - @Override - public void apply(Metadata entry) { - addAlarm(newDate(entry.getValue(AlarmFields.TIME))); - } - }); - } - - @Override - protected void afterInflate() { - this.alertsContainer = (LinearLayout) getView().findViewById(R.id.alert_container); - View.OnClickListener addAlarmListener = new View.OnClickListener() { - @Override - public void onClick(View arg0) { - addAlarm(newDate()); - } - }; - getView().findViewById(R.id.alarms_add).setOnClickListener(addAlarmListener); - } - - @Override - protected void writeToModelAfterInitialized(Task task) { - LinkedHashSet alarms = new LinkedHashSet<>(); - for(int i = 0; i < alertsContainer.getChildCount(); i++) { - Long dateValue = (Long) alertsContainer.getChildAt(i).getTag(); - if(dateValue == null) { - continue; - } - alarms.add(dateValue); - } - - if(alarmService.synchronizeAlarms(task.getId(), alarms)) { - task.setModificationDate(DateUtilities.now()); - } - } - - private void addAlarm(Date alert) { - final View alertItem = LayoutInflater.from(activity).inflate(R.layout.alarm_edit_row, null); - alertsContainer.addView(alertItem); - - alertItem.setOnClickListener(new OnClickListener() { - @Override - public void onClick(final View v) { - DateAndTimePickerDialog.dateAndTimePickerDialog(taskEditFragment.getFragmentManager(), taskEditFragment.getActivity(), newDateTime((Long) alertItem.getTag()), new DateAndTimePickerDialog.OnDateTimePicked() { - @Override - 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 onDismiss(DialogInterface dialog) { - } - }); - } - }); - - alertItem.setTag(alert.getTime()); - TextView display = (TextView) alertItem.findViewById(R.id.alarm_string); - display.setText(getDisplayString(activity, alert.getTime())); - - ImageButton reminderRemoveButton; - reminderRemoveButton = (ImageButton)alertItem.findViewById(R.id.button1); - reminderRemoveButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - alertsContainer.removeView(alertItem); - } - }); - } - - 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/data/Task.java b/src/main/java/com/todoroo/astrid/data/Task.java index 76f1d195e..72a479cf8 100644 --- a/src/main/java/com/todoroo/astrid/data/Task.java +++ b/src/main/java/com/todoroo/astrid/data/Task.java @@ -576,4 +576,8 @@ public class Task extends RemoteModel { private boolean isReminderFlagSet(int flag) { return (getReminderFlags() & flag) > 0; } + + public boolean hasRandomReminder() { + return getReminderPeriod() > 0; + } } diff --git a/src/main/java/com/todoroo/astrid/tags/TagsControlSet.java b/src/main/java/com/todoroo/astrid/tags/TagsControlSet.java index 3bf5d1e00..741961ef8 100644 --- a/src/main/java/com/todoroo/astrid/tags/TagsControlSet.java +++ b/src/main/java/com/todoroo/astrid/tags/TagsControlSet.java @@ -16,7 +16,6 @@ import android.view.WindowManager; import android.view.inputmethod.EditorInfo; import android.widget.ArrayAdapter; import android.widget.AutoCompleteTextView; -import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.TextView; @@ -211,9 +210,7 @@ public final class TagsControlSet extends PopupControlSet { } }); - ImageButton reminderRemoveButton; - reminderRemoveButton = (ImageButton)tagItem.findViewById(R.id.button1); - reminderRemoveButton.setOnClickListener(new View.OnClickListener() { + tagItem.findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { TextView lastView = getLastTextView(); diff --git a/src/main/java/com/todoroo/astrid/ui/HideUntilControlSet.java b/src/main/java/com/todoroo/astrid/ui/HideUntilControlSet.java index dd912c676..6f6344e45 100644 --- a/src/main/java/com/todoroo/astrid/ui/HideUntilControlSet.java +++ b/src/main/java/com/todoroo/astrid/ui/HideUntilControlSet.java @@ -156,9 +156,7 @@ public class HideUntilControlSet extends TaskEditControlSetBase implements OnIte private void customDateFinished() { HideUntilValue[] list = createHideUntilList(customDate.getTime()); - adapter = new ArrayAdapter<>( - activity, android.R.layout.simple_spinner_item, - list); + adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, list); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); spinner.setSelection(0); diff --git a/src/main/java/com/todoroo/astrid/ui/RandomReminderControlSet.java b/src/main/java/com/todoroo/astrid/ui/RandomReminderControlSet.java index 76db00c14..8f6adc752 100644 --- a/src/main/java/com/todoroo/astrid/ui/RandomReminderControlSet.java +++ b/src/main/java/com/todoroo/astrid/ui/RandomReminderControlSet.java @@ -7,15 +7,11 @@ package com.todoroo.astrid.ui; import android.app.Activity; import android.view.View; -import android.widget.AdapterView; -import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; -import android.widget.CheckBox; import android.widget.Spinner; import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.astrid.data.Task; -import com.todoroo.astrid.helper.TaskEditControlSetBase; import org.tasks.R; @@ -25,34 +21,15 @@ import org.tasks.R; * @author Tim Su * */ -public class RandomReminderControlSet extends TaskEditControlSetBase { +public class RandomReminderControlSet { - private final CheckBox settingCheckbox; private final Spinner periodSpinner; - private boolean periodSpinnerInitialized = false; private final int[] hours; - public RandomReminderControlSet(Activity activity, View parentView, int layout) { - super(activity, layout); - settingCheckbox = (CheckBox) parentView.findViewById(R.id.reminder_random); + public RandomReminderControlSet(Activity activity, View parentView) { periodSpinner = (Spinner) parentView.findViewById(R.id.reminder_random_interval); - periodSpinner.setOnItemSelectedListener(new OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView arg0, View arg1, - int arg2, long arg3) { - if(periodSpinnerInitialized) { - settingCheckbox.setChecked(true); - } - periodSpinnerInitialized = true; - } - - @Override - public void onNothingSelected(AdapterView arg0) { - // ignore - } - }); - + periodSpinner.setVisibility(View.VISIBLE); // create adapter ArrayAdapter adapter = new ArrayAdapter<>( activity, R.layout.simple_spinner_item, @@ -68,16 +45,9 @@ public class RandomReminderControlSet extends TaskEditControlSetBase { } } - @Override - protected void afterInflate() { - // Nothing to do here - } - - @Override - protected void readFromTaskOnInitialize() { + public void readFromTaskOnInitialize(Task model) { long time = model.getReminderPeriod(); - boolean enabled = time > 0; if(time <= 0) { /* default interval for spinner if date is unselected */ time = DateUtilities.ONE_WEEK * 2; @@ -90,20 +60,10 @@ public class RandomReminderControlSet extends TaskEditControlSetBase { } } periodSpinner.setSelection(i); - settingCheckbox.setChecked(enabled); - } - - @Override - protected void writeToModelAfterInitialized(Task task) { - if(settingCheckbox.isChecked()) { - int hourValue = hours[periodSpinner.getSelectedItemPosition()]; - task.setReminderPeriod(hourValue * DateUtilities.ONE_HOUR); - } else { - task.setReminderPeriod(0L); - } } - public boolean hasRandomReminder() { - return settingCheckbox.isChecked(); + public long getReminderPeriod() { + int hourValue = hours[periodSpinner.getSelectedItemPosition()]; + return hourValue * DateUtilities.ONE_HOUR; } } diff --git a/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.java b/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.java index e53c22ade..0a4bf3148 100644 --- a/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.java +++ b/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.java @@ -5,23 +5,38 @@ */ package com.todoroo.astrid.ui; +import android.content.DialogInterface; +import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; +import android.view.ViewGroup; import android.widget.AdapterView; -import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; -import android.widget.CheckBox; import android.widget.LinearLayout; import android.widget.Spinner; 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.alarms.AlarmControlSet; +import com.todoroo.astrid.alarms.AlarmFields; import com.todoroo.astrid.alarms.AlarmService; +import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.Task; +import com.todoroo.astrid.helper.TaskEditControlSetBase; +import org.joda.time.DateTime; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.tasks.R; -import org.tasks.preferences.ActivityPreferences; +import org.tasks.dialogs.DateAndTimePickerDialog; + +import java.util.ArrayList; +import java.util.Date; +import java.util.LinkedHashSet; +import java.util.List; + +import static org.tasks.date.DateTimeUtils.newDateTime; /** * Control set dealing with reminder settings @@ -29,43 +44,36 @@ import org.tasks.preferences.ActivityPreferences; * @author Tim Su * */ -public class ReminderControlSet extends PopupControlSet { - private CheckBox during, after; +public class ReminderControlSet extends TaskEditControlSetBase implements AdapterView.OnItemSelectedListener { + + private static final Logger log = LoggerFactory.getLogger(ReminderControlSet.class); + private Spinner mode; + private Spinner addSpinner; private TextView modeDisplay; - private final TextView label; private RandomReminderControlSet randomControlSet; - private AlarmControlSet alarmControl; - - 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); - label = (TextView) getView().findViewById(R.id.display_row_edit); - alarmControl = new AlarmControlSet(alarmService, taskEditFragment); - LinearLayout reminderRow = (LinearLayout) getView().findViewById(R.id.reminder_row); - reminderRow.addView(alarmControl.getView()); - } + private LinearLayout alertContainer; + private boolean whenDue; + private boolean whenOverdue; + private AlarmService alarmService; + private TaskEditFragment taskEditFragment; + private List spinnerOptions = new ArrayList<>(); + private ArrayAdapter remindAdapter; - public void setValue(int flags) { - during.setChecked((flags & Task.NOTIFY_AT_DEADLINE) > 0); - after.setChecked((flags & - Task.NOTIFY_AFTER_DEADLINE) > 0); - if((flags & Task.NOTIFY_MODE_NONSTOP) > 0) { - mode.setSelection(2); - } else if((flags & Task.NOTIFY_MODE_FIVE) > 0) { - mode.setSelection(1); - } else { - mode.setSelection(0); - } + public ReminderControlSet(AlarmService alarmService, TaskEditFragment taskEditFragment) { + super(taskEditFragment.getActivity(), R.layout.control_set_reminders); + this.alarmService = alarmService; + this.taskEditFragment = taskEditFragment; } public int getValue() { int value = 0; - if(during.isChecked()) { + if(whenDue) { value |= Task.NOTIFY_AT_DEADLINE; } - if(after.isChecked()) { + if(whenOverdue) { value |= Task.NOTIFY_AFTER_DEADLINE; } @@ -79,48 +87,139 @@ public class ReminderControlSet extends PopupControlSet { return value; } + private void addAlarmRow(Long timestamp) { + addAlarmRow(getDisplayString(timestamp), timestamp, new OnClickListener() { + @Override + public void onClick(View v) { + } + }); + } + + private View addAlarmRow(String text, Long timestamp, final View.OnClickListener onRemove) { + final View alertItem = LayoutInflater.from(activity).inflate(R.layout.alarm_edit_row, null); + alertContainer.addView(alertItem); + alertItem.setTag(timestamp); + TextView display = (TextView) alertItem.findViewById(R.id.alarm_string); + display.setText(text); + alertItem.findViewById(R.id.button1).setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + alertContainer.removeView(alertItem); + onRemove.onClick(v); + updateSpinner(); + } + }); + updateSpinner(); + return alertItem; + } + + private void addNewAlarm() { + DateAndTimePickerDialog.dateAndTimePickerDialog(taskEditFragment.getFragmentManager(), + taskEditFragment.getActivity(), newDateTime().withMillisOfDay(0), + new DateAndTimePickerDialog.OnDateTimePicked() { + @Override + public void onDateTimePicked(DateTime dateTime) { + addAlarmRow(dateTime.getMillis()); + } + }, new DialogInterface.OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialog) { + + } + }); + } + + private void updateSpinner() { + addSpinner.setSelection(0); + spinnerOptions.clear(); + spinnerOptions.add(""); + if (!whenDue) { + spinnerOptions.add(taskEditFragment.getString(R.string.when_due)); + } + if (!whenOverdue) { + spinnerOptions.add(taskEditFragment.getString(R.string.when_overdue)); + } + if (randomControlSet == null) { + spinnerOptions.add(taskEditFragment.getString(R.string.randomly)); + } + spinnerOptions.add(taskEditFragment.getString(R.string.pick_a_date_and_time)); + remindAdapter.notifyDataSetChanged(); + } + @Override protected void afterInflate() { - during = (CheckBox) getDialogView().findViewById(R.id.reminder_due); - after = (CheckBox) getDialogView().findViewById(R.id.reminder_overdue); - modeDisplay = (TextView) getDialogView().findViewById(R.id.reminder_alarm_display); - mode = (Spinner) getDialogView().findViewById(R.id.reminder_alarm); - View modeContainer = getDialogView().findViewById(R.id.reminder_alarm_container); - modeContainer.setOnClickListener(new OnClickListener() { + alertContainer = (LinearLayout) getView().findViewById(R.id.alert_container); + getView().findViewById(R.id.alarms_add).setOnClickListener(new OnClickListener() { + @Override + public void onClick(View arg0) { + if (spinnerOptions.size() == 2) { + addNewAlarm(); + } else { + addSpinner.setOnItemSelectedListener(ReminderControlSet.this); + addSpinner.performClick(); + } + } + }); + addSpinner = (Spinner) getView().findViewById(R.id.alarms_add_spinner); + remindAdapter = new ArrayAdapter(activity, R.layout.simple_spinner_item, spinnerOptions) { + @Override + public View getDropDownView(int position, View convertView, ViewGroup parent) { + View v; + + // If this is the initial dummy entry, make it hidden + if (position == 0) { + TextView tv = new TextView(getContext()); + tv.setHeight(0); + tv.setVisibility(View.GONE); + v = tv; + } + else { + // Pass convertView as null to prevent reuse of special case views + v = super.getDropDownView(position, null, parent); + } + + // Hide scroll bar because it appears sometimes unnecessarily, this does not prevent scrolling + parent.setVerticalScrollBarEnabled(false); + return v; + } + }; + addSpinner.setAdapter(remindAdapter); + remindAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + modeDisplay = (TextView) getView().findViewById(R.id.reminder_alarm_display); + mode = (Spinner) getView().findViewById(R.id.reminder_alarm); + modeDisplay.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mode.performClick(); } }); - randomControlSet = new RandomReminderControlSet(activity, getDialogView(), -1); - String[] list = new String[] { - activity.getString(R.string.TEA_reminder_mode_once), - activity.getString(R.string.TEA_reminder_mode_five), - activity.getString(R.string.TEA_reminder_mode_nonstop), + activity.getString(R.string.ring_once), + activity.getString(R.string.ring_five_times), + activity.getString(R.string.ring_nonstop), }; - final ArrayAdapter adapter = new ArrayAdapter<>( + final ArrayAdapter modeAdapter = new ArrayAdapter<>( activity, android.R.layout.simple_spinner_item, list); - adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - mode.setOnItemSelectedListener(new OnItemSelectedListener() { + modeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + mode.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView parent, View view, int position, long id) { - modeDisplay.setText(adapter.getItem(position)); + modeDisplay.setText(modeAdapter.getItem(position)); } @Override public void onNothingSelected(AdapterView parent) { - // TODO Auto-generated method stub +// TODO Auto-generated method stub } }); activity.runOnUiThread(new Runnable() { @Override public void run() { - mode.setAdapter(adapter); + mode.setAdapter(modeAdapter); } }); } @@ -128,76 +227,120 @@ public class ReminderControlSet extends PopupControlSet { @Override protected void readFromTaskOnInitialize() { setValue(model.getReminderFlags()); - // Calls to get view will force other control sets to load - randomControlSet.readFromTask(model); - randomControlSet.readFromTaskOnInitialize(); + + alertContainer.removeAllViews(); + if (whenDue) { + addDue(); + } + if (whenOverdue) { + addOverdue(); + } + if (model.hasRandomReminder()) { + addRandomReminder(); + } + alarmService.getAlarms(model.getId(), new Callback() { + @Override + public void apply(Metadata entry) { + addAlarmRow(entry.getValue(AlarmFields.TIME)); + } + }); + updateSpinner(); } - @Override - protected void writeToModelAfterInitialized(Task task) { - task.setReminderFlags(getValue()); + private void addDue() { + whenDue = true; + addAlarmRow(taskEditFragment.getString(R.string.when_due), null, new OnClickListener() { + @Override + public void onClick(View v) { + whenDue = false; + } + }); + } - randomControlSet.writeToModel(task); - alarmControl.writeToModel(task); + private void addOverdue() { + whenOverdue = true; + addAlarmRow(taskEditFragment.getString(R.string.when_overdue), null, new OnClickListener() { + @Override + public void onClick(View v) { + whenOverdue = false; + } + }); } - @Override - protected void refreshDisplayView() { - int reminderCount = 0; - StringBuilder reminderString = new StringBuilder(); - - // Has random reminder? - if ((randomControlSet != null && randomControlSet.hasRandomReminder()) || (randomControlSet == null && model.getReminderPeriod() > 0)) { - reminderString.append(activity.getString(R.string.TEA_reminder_randomly_short)); - reminderCount++; - } + private void addRandomReminder() { + View alarmRow = addAlarmRow(taskEditFragment.getString(R.string.randomly_once), null, new OnClickListener() { + @Override + public void onClick(View v) { + randomControlSet = null; + } + }); + randomControlSet = new RandomReminderControlSet(activity, alarmRow); + randomControlSet.readFromTaskOnInitialize(model); + } + + private void setValue(int flags) { + whenDue = (flags & Task.NOTIFY_AT_DEADLINE) > 0; + whenOverdue = (flags & Task.NOTIFY_AFTER_DEADLINE) > 0; - int value; - if (initialized) { - value = getValue(); + if((flags & Task.NOTIFY_MODE_NONSTOP) > 0) { + mode.setSelection(2); + } else if((flags & Task.NOTIFY_MODE_FIVE) > 0) { + mode.setSelection(1); } else { - value = model.getReminderFlags(); + mode.setSelection(0); } + } - boolean appendedWhen = false; - if ((value & Task.NOTIFY_AT_DEADLINE) > 0) { - if (reminderCount > 0) { - reminderString.append(" & "); //$NON-NLS-1$ - } + @Override + protected void writeToModelAfterInitialized(Task task) { + task.setReminderFlags(getValue()); - reminderString.append(activity.getString(R.string.TEA_reminder_when)).append(" "); //$NON-NLS-1$ - reminderString.append(activity.getString(R.string.TEA_reminder_due_short)); - reminderCount++; - appendedWhen = true; - } + task.setReminderPeriod(randomControlSet == null ? 0L : randomControlSet.getReminderPeriod()); - if ((value & Task.NOTIFY_AFTER_DEADLINE) > 0 && reminderCount < 2) { - if (reminderCount > 0) { - reminderString.append(" & "); //$NON-NLS-1$ + LinkedHashSet alarms = new LinkedHashSet<>(); + for(int i = 0; i < alertContainer.getChildCount(); i++) { + Long dateValue = (Long) alertContainer.getChildAt(i).getTag(); + if(dateValue == null) { + continue; } + alarms.add(dateValue); + } - if (!appendedWhen) { - reminderString.append(activity.getString(R.string.TEA_reminder_when)).append(" "); //$NON-NLS-1$ - } - reminderString.append(activity.getString(R.string.TEA_reminder_overdue_short)); - reminderCount++; + if(alarmService.synchronizeAlarms(task.getId(), alarms)) { + task.setModificationDate(DateUtilities.now()); } + } - if (reminderCount > 0) { - String toDisplay; - if (reminderCount == 1) { - toDisplay = activity.getString(R.string.TEA_reminder_display_one, reminderString.toString()); - } else { - toDisplay = activity.getString(R.string.TEA_reminder_display_multiple, reminderString.toString()); - } + private String getDisplayString(long forDate) { + DateTime dateTime = newDateTime(forDate); + Date d = dateTime.toDate(); + return (dateTime.getYear() == newDateTime().getYear() + ? DateUtilities.getDateStringHideYear(d) + : DateUtilities.getDateString(d)) + + ", " + DateUtilities.getTimeString(activity, d); + } - label.setText(toDisplay); - label.setTextColor(themeColor); - } else { - label.setText(R.string.TEA_reminders_group_label); - label.setTextColor(unsetColor); + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + log.info("onItemSelected({}, {}, {}, {})", parent, view, position, id); + addSpinner.setOnItemSelectedListener(null); + String selected = spinnerOptions.get(position); + if (selected.equals(taskEditFragment.getString(R.string.when_due))) { + addDue(); + } else if(selected.equals(taskEditFragment.getString(R.string.when_overdue))) { + addOverdue(); + } else if (selected.equals(taskEditFragment.getString(R.string.randomly))) { + addRandomReminder(); + } else if (selected.equals(taskEditFragment.getString(R.string.pick_a_date_and_time))) { + addNewAlarm(); + } + if (position != 0) { + updateSpinner(); } + } - alarmControl.readFromTask(model); + @Override + public void onNothingSelected(AdapterView parent) { + addSpinner.setOnItemSelectedListener(null); } } diff --git a/src/main/res/drawable-hdpi/btn_dismiss_normal.png b/src/main/res/drawable-hdpi/btn_dismiss_normal.png deleted file mode 100644 index 56d75951b..000000000 Binary files a/src/main/res/drawable-hdpi/btn_dismiss_normal.png and /dev/null differ diff --git a/src/main/res/drawable-hdpi/btn_dismiss_pressed.png b/src/main/res/drawable-hdpi/btn_dismiss_pressed.png deleted file mode 100644 index 888bb1e7f..000000000 Binary files a/src/main/res/drawable-hdpi/btn_dismiss_pressed.png and /dev/null differ diff --git a/src/main/res/drawable-hdpi/ic_action_cancel_white.png b/src/main/res/drawable-hdpi/ic_action_cancel_white.png new file mode 100644 index 000000000..a85355eef Binary files /dev/null and b/src/main/res/drawable-hdpi/ic_action_cancel_white.png differ diff --git a/src/main/res/drawable-xhdpi/btn_dismiss_normal.png b/src/main/res/drawable-xhdpi/btn_dismiss_normal.png deleted file mode 100644 index d4cd21524..000000000 Binary files a/src/main/res/drawable-xhdpi/btn_dismiss_normal.png and /dev/null differ diff --git a/src/main/res/drawable-xhdpi/btn_dismiss_pressed.png b/src/main/res/drawable-xhdpi/btn_dismiss_pressed.png deleted file mode 100644 index ed6fdbe73..000000000 Binary files a/src/main/res/drawable-xhdpi/btn_dismiss_pressed.png and /dev/null differ diff --git a/src/main/res/drawable-xhdpi/ic_action_cancel_white.png b/src/main/res/drawable-xhdpi/ic_action_cancel_white.png new file mode 100644 index 000000000..d8a9468cf Binary files /dev/null and b/src/main/res/drawable-xhdpi/ic_action_cancel_white.png differ diff --git a/src/main/res/drawable-xxhdpi/ic_action_cancel_white.png b/src/main/res/drawable-xxhdpi/ic_action_cancel_white.png new file mode 100644 index 000000000..c55cd1828 Binary files /dev/null and b/src/main/res/drawable-xxhdpi/ic_action_cancel_white.png differ diff --git a/src/main/res/drawable/btn_dismiss.xml b/src/main/res/drawable/btn_dismiss.xml deleted file mode 100644 index 78deabd1c..000000000 --- a/src/main/res/drawable/btn_dismiss.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - diff --git a/src/main/res/drawable/btn_dismiss_normal.png b/src/main/res/drawable/btn_dismiss_normal.png deleted file mode 100644 index 1dd95a754..000000000 Binary files a/src/main/res/drawable/btn_dismiss_normal.png and /dev/null differ diff --git a/src/main/res/drawable/btn_dismiss_pressed.png b/src/main/res/drawable/btn_dismiss_pressed.png deleted file mode 100644 index e400257ff..000000000 Binary files a/src/main/res/drawable/btn_dismiss_pressed.png and /dev/null differ diff --git a/src/main/res/drawable/ic_action_cancel_white.png b/src/main/res/drawable/ic_action_cancel_white.png new file mode 100644 index 000000000..4c997967f Binary files /dev/null and b/src/main/res/drawable/ic_action_cancel_white.png differ diff --git a/src/main/res/layout/alarm_edit_row.xml b/src/main/res/layout/alarm_edit_row.xml index 1b9c4c748..c81a199fc 100644 --- a/src/main/res/layout/alarm_edit_row.xml +++ b/src/main/res/layout/alarm_edit_row.xml @@ -4,21 +4,37 @@ android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingBottom="@dimen/task_edit_padding_top_bottom" - android:layout_marginBottom="@dimen/task_edit_padding_top_bottom" > + android:layout_marginBottom="@dimen/task_edit_padding_top_bottom"> - + android:orientation="horizontal" + android:layout_weight="100"> - + + + + + + + android:layout_weight="1" + android:paddingRight="3dp" + android:paddingEnd="3dp" /> + diff --git a/src/main/res/layout/control_set_alarms.xml b/src/main/res/layout/control_set_alarms.xml deleted file mode 100644 index be444c5e5..000000000 --- a/src/main/res/layout/control_set_alarms.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - diff --git a/src/main/res/layout/control_set_reminders.xml b/src/main/res/layout/control_set_reminders.xml index 892b270ba..ca490f5dc 100644 --- a/src/main/res/layout/control_set_reminders.xml +++ b/src/main/res/layout/control_set_reminders.xml @@ -24,26 +24,71 @@ + android:orientation="vertical" + android:paddingTop="@dimen/task_edit_padding_top_bottom" + android:paddingBottom="@dimen/task_edit_padding_top_bottom" + android:layout_marginTop="@dimen/task_edit_padding_top_bottom" + android:layout_marginBottom="@dimen/task_edit_padding_top_bottom"> - + + android:orientation="horizontal"> + + + + + + + + + + + + + + + + + + diff --git a/src/main/res/layout/control_set_reminders_dialog.xml b/src/main/res/layout/control_set_reminders_dialog.xml deleted file mode 100644 index 338fd01d0..000000000 --- a/src/main/res/layout/control_set_reminders_dialog.xml +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/res/layout/tag_edit_row.xml b/src/main/res/layout/tag_edit_row.xml index 4a0650b6c..b115f4d0d 100644 --- a/src/main/res/layout/tag_edit_row.xml +++ b/src/main/res/layout/tag_edit_row.xml @@ -27,11 +27,13 @@ style="@style/TextBoxText" android:textColorHint="?attr/asTextColorHint" android:inputType="textCapSentences"/> - - + android:layout_margin="4dip" + android:layout_width="32dip" + android:layout_height="32dip" /> diff --git a/src/main/res/values-ar/strings.xml b/src/main/res/values-ar/strings.xml index 82a83e83a..e268a2adf 100644 --- a/src/main/res/values-ar/strings.xml +++ b/src/main/res/values-ar/strings.xml @@ -57,8 +57,6 @@ Next Week Next Month - ذكرني %s - تذكير %s تذكير! اكمل غفوة diff --git a/src/main/res/values-bg-rBG/strings.xml b/src/main/res/values-bg-rBG/strings.xml index 8582687a6..adc628fce 100644 --- a/src/main/res/values-bg-rBG/strings.xml +++ b/src/main/res/values-bg-rBG/strings.xml @@ -331,16 +331,6 @@ Когато задачата е към крайния срок Когато задачата е просрочена Случайно веднъж - Тип на Тон на звънене/вибрация - Веднъж - Пет пъти - Докато не отхвърля алармата - кога - до - просрочен - произволно - Напомни ми %s - Напомни %s час ден diff --git a/src/main/res/values-ca/strings.xml b/src/main/res/values-ca/strings.xml index 2eb0edb38..07b16eb6b 100644 --- a/src/main/res/values-ca/strings.xml +++ b/src/main/res/values-ca/strings.xml @@ -199,9 +199,6 @@ S\'està autenticant... Té $NUM coincidència: $FILTER Recordatoris - Tipus de So/Vibració - Sona una vegada - Sona fins que es cancel·la l\'alarma ¡Recordatori! Acabat Adorm diff --git a/src/main/res/values-cs/strings.xml b/src/main/res/values-cs/strings.xml index 1c088ad65..329f07a6c 100644 --- a/src/main/res/values-cs/strings.xml +++ b/src/main/res/values-cs/strings.xml @@ -316,15 +316,6 @@ Při termínu Úkol po termínu Jednou náhodně - Typ vyzvánění/vybrací: - Vyzvánět jednou - Pět zazvonění - Vyzvánět dokud nezruším Alarm - končí - po termínu - náhodně - Připomínat mi %s - Připomenout %s hodina den diff --git a/src/main/res/values-da/strings.xml b/src/main/res/values-da/strings.xml index 19d5f5cc8..296cf670b 100644 --- a/src/main/res/values-da/strings.xml +++ b/src/main/res/values-da/strings.xml @@ -164,8 +164,6 @@ Du har $NUM der matcher: $FILTER når deadline er nået når deadline er overskredet - Ring en gang - Ring indtil jeg slår alarmen fra en time en dag diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml index 7c3def667..13579334c 100644 --- a/src/main/res/values-de/strings.xml +++ b/src/main/res/values-de/strings.xml @@ -324,16 +324,6 @@ Wenn Aufgabe fällig ist Wenn Aufgabe überfällig ist Einmal zufällig - Klingeln/Vibrieren Typ: - Einmal - Fünfmal - Bis ich den Alarm abschalte - wenn - fällig - überfällig - zufällig - Erinnere mich %s - Erinnern %s einer Stunde einem Tag diff --git a/src/main/res/values-el/strings.xml b/src/main/res/values-el/strings.xml index 5e379ebaf..521ac2766 100644 --- a/src/main/res/values-el/strings.xml +++ b/src/main/res/values-el/strings.xml @@ -321,16 +321,6 @@ Πότε λήγει η εργασία Όταν η εργασία είναι καθυστερούμενη Τυχαία μια φορά - Ήχος/τύπος δόνησης - Μία φορά - Πέντε φορές - Μέχρι να κλείσω την ειδοποίηση - Όταν - λήξη - καθυστερούμενη - τυχαία - Υπενθύμισε μου %s - Υπενθύμιση %s μια ώρα μια μέρα diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml index b252e5cdb..fc677fcd6 100644 --- a/src/main/res/values-es/strings.xml +++ b/src/main/res/values-es/strings.xml @@ -321,16 +321,6 @@ Cuando la tarea es finalizada Cuando la tarea está retrasada Aleatorio, una sola vez - Tipo de Tono/Vibración: - Una vez - Cinco veces - Hasta que cancele la alarma - cuando - límite - retrasado - aleatoriamente - Recordarme %s - Recordar %s una hora un día diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml index 14c40dcb1..bdd331b49 100644 --- a/src/main/res/values-fr/strings.xml +++ b/src/main/res/values-fr/strings.xml @@ -320,16 +320,6 @@ ... lorsque la tâche est échue ... lorsque la tâche est en retard Une fois aléatoirement - Type de sonnerie/vibration : - Une fois - Cinq fois - Jusqu\'à ce que j\'annule l\'alarme - Quand - prévu - en retard - Aléatoirement - Me rappeler %s - Rappel %s Une heure Un jour diff --git a/src/main/res/values-it/strings.xml b/src/main/res/values-it/strings.xml index f82899186..382ce981a 100644 --- a/src/main/res/values-it/strings.xml +++ b/src/main/res/values-it/strings.xml @@ -292,7 +292,6 @@ Se visualizzi questo errore più volte, ti consigliamo di cancellare tutti i dat Alla scadenza dell\'attività Quando l\'attività è in ritardo In modo casuale - Tipo di squillo/vibrazione: an hour ogni giorno diff --git a/src/main/res/values-iw/strings.xml b/src/main/res/values-iw/strings.xml index dd3ccd321..03f6f21d7 100644 --- a/src/main/res/values-iw/strings.xml +++ b/src/main/res/values-iw/strings.xml @@ -322,14 +322,6 @@ כאשר הגיע מועד היעד כשעבר מועד היעד אקראי יחיד - סוג צלצול/רטט: - פעם אחת - חמש פעמים - עד אשר אבטל את התזכורות - מתי - מועד יעד - באקראיות - הזכר לי %s שעה יום diff --git a/src/main/res/values-ja/strings.xml b/src/main/res/values-ja/strings.xml index 84b211462..6b6e9f068 100644 --- a/src/main/res/values-ja/strings.xml +++ b/src/main/res/values-ja/strings.xml @@ -329,16 +329,6 @@ 何時がタスクの期限ですか? 何時タスクが期限切れになりますか? ランダムに1回 - 通知音、振動 - 1回 - 5回 - 私がアラームを止めるまで - - 期限 - 期限過ぎ - ランダムに - 通知する %s - 通知する %s 1時間 1日 diff --git a/src/main/res/values-ko/strings.xml b/src/main/res/values-ko/strings.xml index 8fea38922..588f67ece 100644 --- a/src/main/res/values-ko/strings.xml +++ b/src/main/res/values-ko/strings.xml @@ -328,16 +328,6 @@ 일정 마감일에 일정 마감일이 지났을 때 무작위로 한 번 - 소리/진동 선택: - 한 번 - 다섯 번 - 알람을 직접 끌 때까지 - 언제 - 마감 - 기한 초과 - 임의로 - %s를 알려주세요 - %s 알리기 한 시간 하루 diff --git a/src/main/res/values-nb/strings.xml b/src/main/res/values-nb/strings.xml index 65a228afc..1c82ffc0e 100644 --- a/src/main/res/values-nb/strings.xml +++ b/src/main/res/values-nb/strings.xml @@ -156,9 +156,6 @@ Minn meg på... ...når oppgaven forfaller ... når oppgaven har forfalt - Ringe- og vibrasjonstype: - Ring én gang - Ring til jeg slår av alarmen Påminnelse! Allerede utført! Slumre diff --git a/src/main/res/values-nl/strings.xml b/src/main/res/values-nl/strings.xml index 9d151cfc9..31ca99a5c 100644 --- a/src/main/res/values-nl/strings.xml +++ b/src/main/res/values-nl/strings.xml @@ -323,16 +323,6 @@ op einddatum taak op of na einddatum taak Willekeurig eenmalig - Geluid/Trillen: - Eenmaal - Vijf maal - Totdat ik het alarm stop - wanneer - einddatum - te laat - willekeurig - Herinner me %s - Herinner %s een uur een dag diff --git a/src/main/res/values-pl/strings.xml b/src/main/res/values-pl/strings.xml index aa45457d5..a956a4f73 100644 --- a/src/main/res/values-pl/strings.xml +++ b/src/main/res/values-pl/strings.xml @@ -325,16 +325,6 @@ i odzyskanie zadań z kopi zapasowej (Settings->Sync and backup->Backup-&g W terminie Gdy zadanie jest zaległe Losowo raz - Rodzaj dzwonka/wibracji: - Pojedynczy - Pięć razy - Aż odwołam alarm - kiedy - termin - zaległe - losowo - Przypomnij za %s - Przypomnij %s na godzinę dziennie diff --git a/src/main/res/values-pt-rBR/strings.xml b/src/main/res/values-pt-rBR/strings.xml index 6826bab0a..8b80b525b 100644 --- a/src/main/res/values-pt-rBR/strings.xml +++ b/src/main/res/values-pt-rBR/strings.xml @@ -322,13 +322,6 @@ no dia que a tarefa vencer quando a tarefa estiver atrasada Aleatoriamente uma vez - Tipo de toque/vibração: - Uma vez - Cinco vezes - Até que eu descarte o alarme - Quando - Lembre me %s - Lembrar %s por hora por dia diff --git a/src/main/res/values-pt/strings.xml b/src/main/res/values-pt/strings.xml index 6815816ab..9dec29cbf 100644 --- a/src/main/res/values-pt/strings.xml +++ b/src/main/res/values-pt/strings.xml @@ -326,16 +326,6 @@ das tarefas através de um backup em Definições->Sincronização e backup-& Na data limite Se data limite ultrapassada Uma vez aleatória - Tipo de toque/vibração - Uma vez - 5 vezes - Até remover o alarme - quando - data limite - ultrapassada - aleatoriamente - Lembrar-me %s - Lembrar %s uma hora um dia diff --git a/src/main/res/values-ru/strings.xml b/src/main/res/values-ru/strings.xml index 51982df65..f761c44b0 100644 --- a/src/main/res/values-ru/strings.xml +++ b/src/main/res/values-ru/strings.xml @@ -328,16 +328,6 @@ При наступлении срока выполнения задания Когда задание просрочено Случайно один раз - Тип звонка/вибрации - Один раз - Пять раз - Пока я не отключу сигнал - Когда - Срок - просрочена - случайно - Напомнить мне %s - Напомнить %s час день diff --git a/src/main/res/values-sl-rSI/strings.xml b/src/main/res/values-sl-rSI/strings.xml index b2303e3ab..0809fd0dd 100644 --- a/src/main/res/values-sl-rSI/strings.xml +++ b/src/main/res/values-sl-rSI/strings.xml @@ -326,16 +326,6 @@ Ko opravek dospe Po dospelosti opravka Naključno enkrat - Način zvonenja/vibriranja - Enkrat - Petkrat - Dokler ne ugasnem - kdaj - dospelo - že dospelo - naključno - Opomni me %s - Opomni %s na uro dan diff --git a/src/main/res/values-sv/strings.xml b/src/main/res/values-sv/strings.xml index bbd4e4d75..25163fe90 100644 --- a/src/main/res/values-sv/strings.xml +++ b/src/main/res/values-sv/strings.xml @@ -319,14 +319,6 @@ och återställer dina aktuella uppgifter från en backup ...när uppgiften förfaller ...när uppgiften har förfallit En gång slumpmässigt - Ring/Vibrationsinställning: - En - Fem gånger - Tills jag stänger av alarmet - när - slumpvis - Påminn mig %s - Påminn %s en timme ett dygn diff --git a/src/main/res/values-tr/strings.xml b/src/main/res/values-tr/strings.xml index abc2dfe70..fd3b5e912 100644 --- a/src/main/res/values-tr/strings.xml +++ b/src/main/res/values-tr/strings.xml @@ -295,7 +295,6 @@ Görev son tarihinde Görev son tarihi aşıldığında Bir kere gelişigüzel - Çalma/Titreme Tipi: bir saat bir gün diff --git a/src/main/res/values-uk/strings.xml b/src/main/res/values-uk/strings.xml index 2e1ef7535..eb84b3004 100644 --- a/src/main/res/values-uk/strings.xml +++ b/src/main/res/values-uk/strings.xml @@ -328,16 +328,6 @@ Коли настане термін виконання завдання Коли завдання прострочено Випадково раз - Тип дзвінка/вібрації - Тільки раз - 5 раз - Поки я не відключу сигнал - коли - до - прострочено - випадково - Нагадати мені %s - Нагадати %s година дня diff --git a/src/main/res/values-zh-rCN/strings.xml b/src/main/res/values-zh-rCN/strings.xml index 901d994bf..7f410f9ff 100644 --- a/src/main/res/values-zh-rCN/strings.xml +++ b/src/main/res/values-zh-rCN/strings.xml @@ -273,7 +273,6 @@ 当任务到期时 当任务过期时 随机一次 - 铃响/震动类型: 一个小时 一天 diff --git a/src/main/res/values-zh-rTW/strings.xml b/src/main/res/values-zh-rTW/strings.xml index 84a991455..445ef96d6 100644 --- a/src/main/res/values-zh-rTW/strings.xml +++ b/src/main/res/values-zh-rTW/strings.xml @@ -309,9 +309,6 @@ 當任務工作到期時 當任務工作過期時 隨機一次 - 鈴響/震動類型: - 提醒我 %s - 提醒 %s 一個小時 一天 diff --git a/src/main/res/values/keys.xml b/src/main/res/values/keys.xml index ac8b4b80f..c408d2417 100644 --- a/src/main/res/values/keys.xml +++ b/src/main/res/values/keys.xml @@ -261,4 +261,14 @@ @string/TEA_ctrl_hide_section_pref + + @string/ring_once + @string/ring_five_times + @string/ring_nonstop + + + + @string/EPr_deactivated + + diff --git a/src/main/res/values/strings-core.xml b/src/main/res/values/strings-core.xml index 83c3f4ea9..ad6f784a8 100644 --- a/src/main/res/values/strings-core.xml +++ b/src/main/res/values/strings-core.xml @@ -451,13 +451,6 @@ End calendar events at due time Start calendar events at due time - - - @string/TEA_reminder_mode_once - @string/TEA_reminder_mode_five - @string/TEA_reminder_mode_nonstop - - diff --git a/src/main/res/values/strings-defaults.xml b/src/main/res/values/strings-defaults.xml index d44643483..5ce1be631 100644 --- a/src/main/res/values/strings-defaults.xml +++ b/src/main/res/values/strings-defaults.xml @@ -67,8 +67,4 @@ At deadline or overdue - - - @string/EPr_deactivated - diff --git a/src/main/res/values/strings-reminders.xml b/src/main/res/values/strings-reminders.xml index 928bdcf9b..260da6f1a 100644 --- a/src/main/res/values/strings-reminders.xml +++ b/src/main/res/values/strings-reminders.xml @@ -20,30 +20,15 @@ Randomly once - - Ring/vibrate type - - - Once + + Ring once - Five times + Ring five times - Until I dismiss alarm - - when + Ring nonstop - due - - overdue - - randomly - - Remind me %s - - Remind %s - an hour diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 15c219643..236ee9de5 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -94,6 +94,12 @@ Notification Actions Show snooze and complete actions in notification Add a reminder + Remove + Randomly once + Randomly + Pick a date and time + When overdue + When due diff --git a/src/main/res/values/styles.xml b/src/main/res/values/styles.xml index 143ce93f4..c56fe85e2 100644 --- a/src/main/res/values/styles.xml +++ b/src/main/res/values/styles.xml @@ -103,6 +103,7 @@ @drawable/ic_action_reload_white @drawable/ic_action_calendar_month_white @drawable/ic_action_help_white + @drawable/ic_action_cancel_white #c3c3c3 @android:color/white