diff --git a/api/src/com/todoroo/andlib/utility/DateUtilities.java b/api/src/com/todoroo/andlib/utility/DateUtilities.java index 16c5a9de3..94cfd1b69 100644 --- a/api/src/com/todoroo/andlib/utility/DateUtilities.java +++ b/api/src/com/todoroo/andlib/utility/DateUtilities.java @@ -37,6 +37,42 @@ public class DateUtilities { return date.getTime(); } + /** + * Add the specified amount of months to the given time.
+ * The day of month will stay the same.
+ * + * @param time the base-time (in milliseconds) to which the amount of months is added + * @param interval the amount of months to be added + * @return the calculated time in milliseconds + */ + public static final long addCalendarMonthsToUnixtime(long time, int interval) { + long result = 0; + Date date = new Date(time); + + int month = date.getMonth(); + int year = date.getYear(); + + int yearsToAdd = interval / 12; + int monthsToAdd = interval % 12; + + year += yearsToAdd; + month += monthsToAdd; + + // correct month overflow + if (month > Calendar.DECEMBER) { + month = month - Calendar.DECEMBER - 1; + year++; + } + + // the day stays the same, thats the point + // it's especially important for birthday-reminders + date.setMonth(month); + date.setYear(year); + + result = date.getTime(); + return result; + } + /** Returns unixtime for current time */ public static final long now() { return System.currentTimeMillis(); @@ -58,6 +94,9 @@ public class DateUtilities { /** Represents a single week */ public static long ONE_WEEK = 7 * ONE_DAY; + /** Represents a single minute */ + public static long ONE_MINUTE = ONE_HOUR / 60; + /* ====================================================================== * =========================================================== formatters * ====================================================================== */ diff --git a/astrid/plugin-src/com/todoroo/astrid/reminders/NotificationActivity.java b/astrid/plugin-src/com/todoroo/astrid/reminders/NotificationActivity.java index 955a60c22..d2726bd29 100644 --- a/astrid/plugin-src/com/todoroo/astrid/reminders/NotificationActivity.java +++ b/astrid/plugin-src/com/todoroo/astrid/reminders/NotificationActivity.java @@ -182,11 +182,17 @@ public class NotificationActivity extends TaskListActivity implements OnTimeSetL case RepeatControlSet.INTERVAL_HOURS: time += value * DateUtilities.ONE_HOUR; break; + case RepeatControlSet.INTERVAL_MINUTES: + time += value * DateUtilities.ONE_MINUTE; + break; case RepeatControlSet.INTERVAL_WEEKS: time += value * 7 * DateUtilities.ONE_DAY; break; case RepeatControlSet.INTERVAL_MONTHS: - time += value * 30 * DateUtilities.ONE_DAY; + time = DateUtilities.addCalendarMonthsToUnixtime(time, 1); + break; + case RepeatControlSet.INTERVAL_YEARS: + time = DateUtilities.addCalendarMonthsToUnixtime(time, 12); break; } diff --git a/astrid/plugin-src/com/todoroo/astrid/repeats/RepeatControlSet.java b/astrid/plugin-src/com/todoroo/astrid/repeats/RepeatControlSet.java index a6672ac94..a8c4e9e7b 100644 --- a/astrid/plugin-src/com/todoroo/astrid/repeats/RepeatControlSet.java +++ b/astrid/plugin-src/com/todoroo/astrid/repeats/RepeatControlSet.java @@ -49,6 +49,8 @@ public class RepeatControlSet implements TaskEditControlSet { public static final int INTERVAL_WEEKS = 1; public static final int INTERVAL_MONTHS = 2; public static final int INTERVAL_HOURS = 3; + public static final int INTERVAL_MINUTES = 4; + public static final int INTERVAL_YEARS = 5; private static final int TYPE_DUE_DATE = 0; private static final int TYPE_COMPLETION_DATE = 1; @@ -199,6 +201,12 @@ public class RepeatControlSet implements TaskEditControlSet { case HOURLY: interval.setSelection(INTERVAL_HOURS); break; + case MINUTELY: + interval.setSelection(INTERVAL_MINUTES); + break; + case YEARLY: + interval.setSelection(INTERVAL_YEARS); + break; default: // an unhandled recurrence exceptionService.reportError("repeat-unhandled-rule", //$NON-NLS-1$ @@ -265,6 +273,13 @@ public class RepeatControlSet implements TaskEditControlSet { break; case INTERVAL_HOURS: rrule.setFreq(Frequency.HOURLY); + break; + case INTERVAL_MINUTES: + rrule.setFreq(Frequency.MINUTELY); + break; + case INTERVAL_YEARS: + rrule.setFreq(Frequency.YEARLY); + break; } result = rrule.toIcal(); diff --git a/astrid/plugin-src/com/todoroo/astrid/repeats/RepeatDetailExposer.java b/astrid/plugin-src/com/todoroo/astrid/repeats/RepeatDetailExposer.java index 9d8c87eb1..f1f83c02a 100644 --- a/astrid/plugin-src/com/todoroo/astrid/repeats/RepeatDetailExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/repeats/RepeatDetailExposer.java @@ -80,6 +80,10 @@ public class RepeatDetailExposer extends BroadcastReceiver { interval = r.getQuantityString(R.plurals.DUt_months, rrule.getInterval(), rrule.getInterval()); break; + case YEARLY: + interval = r.getQuantityString(R.plurals.DUt_years, rrule.getInterval(), + rrule.getInterval()); + break; default: // not designed to be used, only a fail-safe interval = rrule.getInterval() + "-" + rrule.getFreq().name(); //$NON-NLS-1$ diff --git a/astrid/plugin-src/com/todoroo/astrid/repeats/RepeatTaskCompleteListener.java b/astrid/plugin-src/com/todoroo/astrid/repeats/RepeatTaskCompleteListener.java index ae20655e2..a55cbd265 100644 --- a/astrid/plugin-src/com/todoroo/astrid/repeats/RepeatTaskCompleteListener.java +++ b/astrid/plugin-src/com/todoroo/astrid/repeats/RepeatTaskCompleteListener.java @@ -97,6 +97,8 @@ public class RepeatTaskCompleteListener extends BroadcastReceiver { if(rrule.getFreq() == Frequency.HOURLY) return handleHourlyRepeat(original, rrule); + else if(rrule.getFreq() == Frequency.MINUTELY) + return handleMinutelyRepeat(original, rrule); else return invokeRecurrence(rrule, original, startDateAsDV); } @@ -199,4 +201,11 @@ public class RepeatTaskCompleteListener extends BroadcastReceiver { return newDueDate; } + private static long handleMinutelyRepeat(Date startDate, RRule rrule) { + long newDueDate; + newDueDate = Task.createDueDate(Task.URGENCY_SPECIFIC_DAY_TIME, + startDate.getTime() + DateUtilities.ONE_MINUTE * rrule.getInterval()); + return newDueDate; + } + } diff --git a/astrid/res/values-ca/strings.xml b/astrid/res/values-ca/strings.xml index eab6c955e..4faa84d02 100644 --- a/astrid/res/values-ca/strings.xml +++ b/astrid/res/values-ca/strings.xml @@ -1750,11 +1750,13 @@ Astrid is open-source and proudly maintained by Todoroo, Inc. Interval de Repecitiò - + Dia/es Setmana/es Mes/os Hora/es + Minut/s + Year(s) diff --git a/astrid/res/values-cs/strings.xml b/astrid/res/values-cs/strings.xml index 10e789df3..ed4a80b48 100644 --- a/astrid/res/values-cs/strings.xml +++ b/astrid/res/values-cs/strings.xml @@ -1737,11 +1737,13 @@ Astrid is open-source and proudly maintained by Todoroo, Inc. Opakovací interval - + Dnů Týdnů Měsíců Hodin + Minut + Year(s) diff --git a/astrid/res/values-da/strings.xml b/astrid/res/values-da/strings.xml index 56a87ba96..ee101a17c 100644 --- a/astrid/res/values-da/strings.xml +++ b/astrid/res/values-da/strings.xml @@ -1733,11 +1733,13 @@ Astrid is open-source and proudly maintained by Todoroo, Inc. Repeat Interval - + Dag(e) Uge(r) Måned(er) Time(r) + Minut(er) + Year(s) diff --git a/astrid/res/values-de/strings.xml b/astrid/res/values-de/strings.xml index 033f3af90..65edf83cb 100644 --- a/astrid/res/values-de/strings.xml +++ b/astrid/res/values-de/strings.xml @@ -1730,11 +1730,13 @@ Achtung: diese Aufgaben sind unwiederbringlich verloren, wenn Sie kein Backup ge Wiederholungsintervall - + Tag(e) Woche(n) Monat(e) Stunde(n) + Minute(n) + Jahr(e) diff --git a/astrid/res/values-es/strings.xml b/astrid/res/values-es/strings.xml index e3d17fa85..f33087e15 100644 --- a/astrid/res/values-es/strings.xml +++ b/astrid/res/values-es/strings.xml @@ -1748,11 +1748,13 @@ Astrid is open-source and proudly maintained by Todoroo, Inc. Intervalo de repetición - + Día(s) Semana(s) Mes(es) Hora(s) + Minuto(s) + Year(s) diff --git a/astrid/res/values-fr/strings.xml b/astrid/res/values-fr/strings.xml index 0a3159c3f..273cdbeb3 100644 --- a/astrid/res/values-fr/strings.xml +++ b/astrid/res/values-fr/strings.xml @@ -1734,11 +1734,13 @@ Astrid is open-source and proudly maintained by Todoroo, Inc. Interval de répétition - + Jour(s) Semaine(s) Mois Heure(s) + Minute(s) + Year(s) diff --git a/astrid/res/values-he/strings.xml b/astrid/res/values-he/strings.xml index 2b34e005d..238c35323 100644 --- a/astrid/res/values-he/strings.xml +++ b/astrid/res/values-he/strings.xml @@ -1763,11 +1763,13 @@ you get stuff done. It features reminders, tags, sync, Locale plug-in, a widget Repeat Interval - + יום/ימים שבוע/(ות) חודש/ים שעה/ות + דקה/דקות + Year(s) diff --git a/astrid/res/values-it/strings.xml b/astrid/res/values-it/strings.xml index 82554bd83..048737a05 100644 --- a/astrid/res/values-it/strings.xml +++ b/astrid/res/values-it/strings.xml @@ -1734,11 +1734,13 @@ Astrid is open-source and proudly maintained by Todoroo, Inc. Intervallo di ripetizione - + Giorno(i) Settimana(e) Mese(i) Ora(e) + Minuto(i) + Year(s) diff --git a/astrid/res/values-ja/strings.xml b/astrid/res/values-ja/strings.xml index f86460c93..3156f0082 100644 --- a/astrid/res/values-ja/strings.xml +++ b/astrid/res/values-ja/strings.xml @@ -1738,11 +1738,13 @@ you get stuff done. It features reminders, tags, sync, Locale plug-in, a widget 繰り返し間隔 - + 日毎 週毎 か月毎 時間毎 + Minute(s) + Year(s) diff --git a/astrid/res/values-ko/strings.xml b/astrid/res/values-ko/strings.xml index 2ec7a30ab..1f345aade 100644 --- a/astrid/res/values-ko/strings.xml +++ b/astrid/res/values-ko/strings.xml @@ -1745,11 +1745,13 @@ Astrid is open-source and proudly maintained by Todoroo, Inc. 반복 주기 - + + Minute(s) + Year(s) diff --git a/astrid/res/values-nb/strings.xml b/astrid/res/values-nb/strings.xml index 66ea71cb3..9eb0bc1a2 100644 --- a/astrid/res/values-nb/strings.xml +++ b/astrid/res/values-nb/strings.xml @@ -1741,11 +1741,13 @@ Astrid is open-source and proudly maintained by Todoroo, Inc. Gjentakelsesintervall - + Dag(er) Uke(r) Måned(er) Time(r) + Minutt(er) + Year(s) diff --git a/astrid/res/values-nl/strings.xml b/astrid/res/values-nl/strings.xml index ce89a3560..173827284 100644 --- a/astrid/res/values-nl/strings.xml +++ b/astrid/res/values-nl/strings.xml @@ -1716,11 +1716,13 @@ Herhaal interval - + Dag(en) Week/Weken Maand(en) Uur/Uren + Minuut/Minuten + Year(s) diff --git a/astrid/res/values-pl/strings.xml b/astrid/res/values-pl/strings.xml index afa370a48..20dcf97d4 100644 --- a/astrid/res/values-pl/strings.xml +++ b/astrid/res/values-pl/strings.xml @@ -1745,11 +1745,13 @@ Astrid is open-source and proudly maintained by Todoroo, Inc. Odstęp powtarzania - + Dzień/Dni Tydzień/Tygodni(e) Miesiąc/Miesiący(e) Godzinę(y)/Godzin + Minuta/Minut + Year(s) diff --git a/astrid/res/values-pt/strings.xml b/astrid/res/values-pt/strings.xml index 0592488d1..6100d1700 100644 --- a/astrid/res/values-pt/strings.xml +++ b/astrid/res/values-pt/strings.xml @@ -1753,11 +1753,13 @@ Astrid might not let you know when your tasks are due.\n Repeat Interval - + Dia(s) Semana(s) Mês(es) Hora(s) + Minuto(s) + Year(s) diff --git a/astrid/res/values-ru/strings.xml b/astrid/res/values-ru/strings.xml index dfc7b9c7b..24ef5da0f 100644 --- a/astrid/res/values-ru/strings.xml +++ b/astrid/res/values-ru/strings.xml @@ -1734,11 +1734,13 @@ Astrid is open-source and proudly maintained by Todoroo, Inc. Интервал повтора - + День(дней) Неделя(ль) Месяц(ев) Час(ов) + минут(а) + Year(s) diff --git a/astrid/res/values-sv/strings.xml b/astrid/res/values-sv/strings.xml index 3cbb3031f..a7a8ce66a 100644 --- a/astrid/res/values-sv/strings.xml +++ b/astrid/res/values-sv/strings.xml @@ -1733,11 +1733,13 @@ Astrid is open-source and proudly maintained by Todoroo, Inc. Upprepningsintervall - + Dag(ar) Vecka (veckor) Månad(er) Timme (timmar) + Minut(er) + Year(s) diff --git a/astrid/res/values-th/strings.xml b/astrid/res/values-th/strings.xml index 283cf070f..c4bf48923 100644 --- a/astrid/res/values-th/strings.xml +++ b/astrid/res/values-th/strings.xml @@ -1761,11 +1761,13 @@ you get stuff done. It features reminders, tags, sync, Locale plug-in, a widget Repeat Interval - + วัน สัปดาห์ เดือน ชั่วโมง + นาที + Year(s) diff --git a/astrid/res/values-zh-rCN/strings.xml b/astrid/res/values-zh-rCN/strings.xml index fdf166d45..7db0c2a3e 100644 --- a/astrid/res/values-zh-rCN/strings.xml +++ b/astrid/res/values-zh-rCN/strings.xml @@ -1717,11 +1717,13 @@ 重复间隔 - + 小时 + Minute(s) + Year(s) diff --git a/astrid/res/values-zh-rTW/strings.xml b/astrid/res/values-zh-rTW/strings.xml index bfc84edef..a53b60169 100644 --- a/astrid/res/values-zh-rTW/strings.xml +++ b/astrid/res/values-zh-rTW/strings.xml @@ -1734,11 +1734,13 @@ Astrid is open-source and proudly maintained by Todoroo, Inc. 重複間隔 - + 小時 + Minute(s) + Year(s) diff --git a/astrid/res/values/strings-repeat.xml b/astrid/res/values/strings-repeat.xml index f0b09acef..d0ffe460d 100644 --- a/astrid/res/values/strings-repeat.xml +++ b/astrid/res/values/strings-repeat.xml @@ -20,11 +20,13 @@ Repeat Interval - + Day(s) Week(s) Month(s) Hour(s) + Minute(s) + Year(s) diff --git a/astrid/src/com/todoroo/astrid/ui/ContactsAutoComplete.java b/astrid/src/com/todoroo/astrid/ui/ContactsAutoComplete.java index f09a6050b..1da05ce8b 100644 --- a/astrid/src/com/todoroo/astrid/ui/ContactsAutoComplete.java +++ b/astrid/src/com/todoroo/astrid/ui/ContactsAutoComplete.java @@ -75,9 +75,13 @@ public class ContactsAutoComplete extends AutoCompleteTextView { // --- cursor stuff private void setUpContacts() { - adapter = new ContactListAdapter((Activity) getContext(), null); - adapter.setCompleteSharedTags(completeTags); - setAdapter(adapter); + try { + adapter = new ContactListAdapter((Activity) getContext(), null); + adapter.setCompleteSharedTags(completeTags); + setAdapter(adapter); + } catch (VerifyError ve) { + adapter = null; + } } // --- getters and setters @@ -92,7 +96,8 @@ public class ContactsAutoComplete extends AutoCompleteTextView { public void setCompleteSharedTags(boolean value) { completeTags = value; - adapter.setCompleteSharedTags(value); + if (adapter != null) + adapter.setCompleteSharedTags(value); } public void setAllowMultiple(boolean allowMultiple) {