Fix issue with invisible recurring appointments
Fixes that recurring appointments goes invisible
when hit by the failsafe limit.
There is still a hard limit in RecurrenceProcessor,
but at least this limit is applied on a per-event
basis, meaning that it's always possible to create
new recurring appointments without them going invisible.
Change-Id: I6c9e1e10db78e1b73ea9f2b7104621fbbd906452
diff --git a/src/com/android/calendarcommon2/RecurrenceProcessor.java b/src/com/android/calendarcommon2/RecurrenceProcessor.java
index 641a161..fd225db 100644
--- a/src/com/android/calendarcommon2/RecurrenceProcessor.java
+++ b/src/com/android/calendarcommon2/RecurrenceProcessor.java
@@ -869,7 +869,9 @@
while (true) {
int monthIndex = 0;
if (failsafe++ > MAX_ALLOWED_ITERATIONS) { // Give up after about 1 second of processing
- throw new DateException("Recurrence processing stuck: " + r.toString());
+ Log.w(TAG, "Recurrence processing stuck with r=" + r + " rangeStart="
+ + rangeStartDateValue + " rangeEnd=" + rangeEndDateValue);
+ break;
}
unsafeNormalize(iterator);
diff --git a/tests/src/com/android/calendarcommon2/RRuleTest.java b/tests/src/com/android/calendarcommon2/RRuleTest.java
index 53988e2..1d72366 100644
--- a/tests/src/com/android/calendarcommon2/RRuleTest.java
+++ b/tests/src/com/android/calendarcommon2/RRuleTest.java
@@ -143,11 +143,17 @@
// Infinite loop, bug 1662110
@MediumTest
public void testFrequencyLimits() throws Exception {
- try {
- runRecurrenceIteratorTest("RRULE:FREQ=SECONDLY;BYSECOND=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14," + "15,16,17,18,19,20,21,22,23,24,25,26,27,28,29," + "30,31,32,33,34,35,36,37,38,39,40,41,42,43,44," + "45,46,47,48,49,50,51,52,53,54,55,56,57,58,59", "20000101", 1, "");
+ // Rather than checking that we get an exception,
+ // we now want to finish, but in a reasonable time
+ final long tenSeconds = 10000;
+ long start = System.currentTimeMillis();
+ runRecurrenceIteratorTest(
+ "RRULE:FREQ=SECONDLY;BYSECOND=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14," +
+ "15,16,17,18,19,20,21,22,23,24,25,26,27,28,29," +
+ "30,31,32,33,34,35,36,37,38,39,40,41,42,43,44," +
+ "45,46,47,48,49,50,51,52,53,54,55,56,57,58,59", "20000101", 1, "20000101");
+ if (System.currentTimeMillis() - start > tenSeconds) {
fail("Don't do that");
- } catch (DateException ex) {
- // pass
}
}