diff options
| author | Fabrice Di Meglio <fdimeglio@google.com> | 2010-02-23 11:50:21 -0800 |
|---|---|---|
| committer | Fabrice Di Meglio <fdimeglio@google.com> | 2010-02-23 16:15:37 -0800 |
| commit | 66c5bd9065f39b93d5d279e3f7c0b81c652ab17b (patch) | |
| tree | e805958acee75a904e1cb07ebc809bf5d6fbf5be /core/java/android/pim | |
| parent | 2ca759dbf52d07fff880499c4ba13d6cc3961190 (diff) | |
| download | frameworks_base-66c5bd9065f39b93d5d279e3f7c0b81c652ab17b.zip frameworks_base-66c5bd9065f39b93d5d279e3f7c0b81c652ab17b.tar.gz frameworks_base-66c5bd9065f39b93d5d279e3f7c0b81c652ab17b.tar.bz2 | |
Fix bug #2449594 (device should fold RRULEs, etc., that are longer than 75 chars)
also fix a NPE in populateComponent() when Calendar.Events.ALL_DAY property was not defined
Change-Id: Ia5f15755b5af437ee1e661122193f318868ddf6d
Diffstat (limited to 'core/java/android/pim')
| -rw-r--r-- | core/java/android/pim/RecurrenceSet.java | 54 |
1 files changed, 51 insertions, 3 deletions
diff --git a/core/java/android/pim/RecurrenceSet.java b/core/java/android/pim/RecurrenceSet.java index 5d09fb5..635323e 100644 --- a/core/java/android/pim/RecurrenceSet.java +++ b/core/java/android/pim/RecurrenceSet.java @@ -18,7 +18,6 @@ package android.pim; import android.content.ContentValues; import android.database.Cursor; -import android.os.Bundle; import android.provider.Calendar; import android.text.TextUtils; import android.text.format.Time; @@ -26,6 +25,7 @@ import android.util.Config; import android.util.Log; import java.util.List; +import java.util.regex.Pattern; /** * Basic information about a recurrence, following RFC 2445 Section 4.8.5. @@ -36,6 +36,7 @@ public class RecurrenceSet { private final static String TAG = "CalendarProvider"; private final static String RULE_SEPARATOR = "\n"; + private final static String FOLDING_SEPARATOR = "\n "; // TODO: make these final? public EventRecurrence[] rrules = null; @@ -309,7 +310,8 @@ public static boolean populateComponent(ContentValues values, String rdateStr = values.getAsString(Calendar.Events.RDATE); String exruleStr = values.getAsString(Calendar.Events.EXRULE); String exdateStr = values.getAsString(Calendar.Events.EXDATE); - boolean allDay = values.getAsInteger(Calendar.Events.ALL_DAY) == 1; + Integer allDayInteger = values.getAsInteger(Calendar.Events.ALL_DAY); + boolean allDay = (null != allDayInteger) ? (allDayInteger == 1) : false; if ((dtstart == -1) || (TextUtils.isEmpty(duration))|| @@ -361,7 +363,7 @@ public static boolean populateComponent(ContentValues values, if (TextUtils.isEmpty(ruleStr)) { return; } - String[] rrules = ruleStr.split(RULE_SEPARATOR); + String[] rrules = getRuleStrings(ruleStr); for (String rrule : rrules) { ICalendar.Property prop = new ICalendar.Property(propertyName); prop.setValue(rrule); @@ -369,6 +371,52 @@ public static boolean populateComponent(ContentValues values, } } + private static String[] getRuleStrings(String ruleStr) { + if (null == ruleStr) { + return new String[0]; + } + String unfoldedRuleStr = unfold(ruleStr); + String[] split = unfoldedRuleStr.split(RULE_SEPARATOR); + int count = split.length; + for (int n = 0; n < count; n++) { + split[n] = fold(split[n]); + } + return split; + } + + + private static final Pattern IGNORABLE_ICAL_WHITESPACE_RE = + Pattern.compile("(?:\\r\\n?|\\n)[ \t]"); + + private static final Pattern FOLD_RE = Pattern.compile(".{75}"); + + /** + * fold and unfolds ical content lines as per RFC 2445 section 4.1. + * + * <h3>4.1 Content Lines</h3> + * + * <p>The iCalendar object is organized into individual lines of text, called + * content lines. Content lines are delimited by a line break, which is a CRLF + * sequence (US-ASCII decimal 13, followed by US-ASCII decimal 10). + * + * <p>Lines of text SHOULD NOT be longer than 75 octets, excluding the line + * break. Long content lines SHOULD be split into a multiple line + * representations using a line "folding" technique. That is, a long line can + * be split between any two characters by inserting a CRLF immediately + * followed by a single linear white space character (i.e., SPACE, US-ASCII + * decimal 32 or HTAB, US-ASCII decimal 9). Any sequence of CRLF followed + * immediately by a single linear white space character is ignored (i.e., + * removed) when processing the content type. + */ + public static String fold(String unfoldedIcalContent) { + return FOLD_RE.matcher(unfoldedIcalContent).replaceAll("$0\r\n "); + } + + public static String unfold(String foldedIcalContent) { + return IGNORABLE_ICAL_WHITESPACE_RE.matcher( + foldedIcalContent).replaceAll(""); + } + private static void addPropertyForDateStr(ICalendar.Component component, String propertyName, String dateStr) { |
