From a3ebd72321bc5b49feae84324dceea03a50b94ac Mon Sep 17 00:00:00 2001 From: Ricki Hirner Date: Sat, 9 May 2015 13:29:28 +0200 Subject: [PATCH] Version bump to 0.7.6 * additional test * minor code optimizations --- .../davdroid/resource/LocalCalendarTest.java | 32 ++++++++++++++- app/src/main/AndroidManifest.xml | 2 +- .../java/at/bitfire/davdroid/Constants.java | 2 +- .../davdroid/resource/LocalCalendar.java | 40 ++++++++++--------- 4 files changed, 54 insertions(+), 22 deletions(-) diff --git a/app/src/androidTest/java/at/bitfire/davdroid/resource/LocalCalendarTest.java b/app/src/androidTest/java/at/bitfire/davdroid/resource/LocalCalendarTest.java index 5b54c8c4..cb832dd7 100644 --- a/app/src/androidTest/java/at/bitfire/davdroid/resource/LocalCalendarTest.java +++ b/app/src/androidTest/java/at/bitfire/davdroid/resource/LocalCalendarTest.java @@ -26,7 +26,18 @@ import android.provider.CalendarContract.Reminders; import android.test.InstrumentationTestCase; import android.util.Log; +import net.fortuna.ical4j.model.DateList; +import net.fortuna.ical4j.model.TimeZone; +import net.fortuna.ical4j.model.TimeZoneRegistry; +import net.fortuna.ical4j.model.TimeZoneRegistryFactory; +import net.fortuna.ical4j.model.parameter.Value; +import net.fortuna.ical4j.model.property.RDate; + +import java.text.ParseException; +import java.util.ArrayList; import java.util.Calendar; +import java.util.List; +import java.util.SimpleTimeZone; import lombok.Cleanup; @@ -140,7 +151,7 @@ public class LocalCalendarTest extends InstrumentationTestCase { assertTrue(testCalendar.findUpdated().length == 0); // insert a "new" event - long id = insertNewEvent(); + final long id = insertNewEvent(); try { // there must be one "new" event now assertTrue(testCalendar.findNew().length == 1); @@ -155,4 +166,23 @@ public class LocalCalendarTest extends InstrumentationTestCase { } } + public void testRecurrenceSetsToAndroidString() throws ParseException { + final String tzId = "Europe/Vienna"; + + // one entry without time zone + final List list = new ArrayList<>(2); + list.add(new RDate(new DateList("20150101T103000,20150102T103000", Value.DATE_TIME))); + assertEquals("20150101T103000,20150102T103000", LocalCalendar.recurrenceSetsToAndroidString(list)); + + // two entries with time zone + list.add(new RDate(new DateList("20150103T103000,20150104T103000", Value.DATE_TIME))); + + final TimeZoneRegistry tzRegistry = TimeZoneRegistryFactory.getInstance().createRegistry(); + final TimeZone tz = tzRegistry.getTimeZone(tzId); + for (RDate rdate : list) + rdate.setTimeZone(tz); + + assertEquals(tzId + ";20150101T103000,20150102T103000,20150103T103000,20150104T103000", LocalCalendar.recurrenceSetsToAndroidString(list)); + } + } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 09abc8af..5af8ee25 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,7 +9,7 @@ { @SuppressLint("InlinedApi") public static void create(Account account, ContentResolver resolver, ServerInfo.ResourceInfo info) throws LocalStorageException { - ContentProviderClient client = resolver.acquireContentProviderClient(CalendarContract.AUTHORITY); + final ContentProviderClient client = resolver.acquireContentProviderClient(CalendarContract.AUTHORITY); if (client == null) throw new LocalStorageException("No Calendar Provider found (Calendar app disabled?)"); @@ -342,12 +342,12 @@ public class LocalCalendar extends LocalCollection { e.setLocation(values.getAsString(Events.EVENT_LOCATION)); e.setDescription(values.getAsString(Events.DESCRIPTION)); - boolean allDay = values.getAsBoolean(Events.ALL_DAY); - long tsStart = values.getAsLong(Events.DTSTART); - Long tsEnd = values.getAsLong(Events.DTEND); - String duration = values.getAsString(Events.DURATION); + final boolean allDay = values.getAsBoolean(Events.ALL_DAY); + final long tsStart = values.getAsLong(Events.DTSTART); + final String duration = values.getAsString(Events.DURATION); String tzId = null; + Long tsEnd = values.getAsLong(Events.DTEND); if (allDay) { e.setDtStart(tsStart, null); if (tsEnd == null) { @@ -529,7 +529,7 @@ public class LocalCalendar extends LocalCollection { @Override protected Builder buildEntry(Builder builder, Resource resource) { - Event event = (Event)resource; + final Event event = (Event)resource; builder = builder .withValue(Events.CALENDAR_ID, id) @@ -542,7 +542,7 @@ public class LocalCalendar extends LocalCollection { .withValue(Events.GUESTS_CAN_MODIFY, 1) .withValue(Events.GUESTS_CAN_SEE_GUESTS, 1); - RecurrenceId recurrenceId = event.getRecurrenceId(); + final RecurrenceId recurrenceId = event.getRecurrenceId(); if (recurrenceId == null) { // this event is a "master event" (not an exception) builder = builder @@ -596,7 +596,7 @@ public class LocalCalendar extends LocalCollection { if (organizer.getScheme() != null && organizer.getScheme().equalsIgnoreCase("mailto")) builder = builder.withValue(Events.ORGANIZER, organizer.getSchemeSpecificPart()); } - + Status status = event.getStatus(); if (status != null) { int statusCode = Events.STATUS_TENTATIVE; @@ -618,7 +618,8 @@ public class LocalCalendar extends LocalCollection { @Override protected void addDataRows(Resource resource, long localID, int backrefIdx) { - Event event = (Event)resource; + final Event event = (Event)resource; + // add exceptions for (Event exception : event.getExceptions()) pendingOperations.add(buildException(newDataInsertBuilder(Events.CONTENT_URI, Events.ORIGINAL_ID, localID, backrefIdx), event, exception).build()); @@ -632,7 +633,8 @@ public class LocalCalendar extends LocalCollection { @Override protected void removeDataRows(Resource resource) { - Event event = (Event)resource; + final Event event = (Event)resource; + // delete exceptions pendingOperations.add(ContentProviderOperation.newDelete(syncAdapterURI(Events.CONTENT_URI)) .withSelection(Events.ORIGINAL_ID + "=?", new String[] { String.valueOf(event.getLocalID())}).build()); @@ -653,10 +655,10 @@ public class LocalCalendar extends LocalCollection { // the original event is an all-day event. Workaround: determine value of ORIGINAL_ALL_DAY // by original event type (all-day or not) and not by whether RECURRENCE-ID is DATE or DATE-TIME. - RecurrenceId recurrenceId = exception.getRecurrenceId(); - Date date = recurrenceId.getDate(); + final RecurrenceId recurrenceId = exception.getRecurrenceId(); + final boolean originalAllDay = master.isAllDay(); - boolean originalAllDay = master.isAllDay(); + Date date = recurrenceId.getDate(); if (originalAllDay && date instanceof DateTime) { String value = recurrenceId.getValue(); if (value.matches("^\\d{8}T\\d{6}$")) @@ -676,13 +678,13 @@ public class LocalCalendar extends LocalCollection { @SuppressLint("InlinedApi") protected Builder buildAttendee(Builder builder, Attendee attendee) { - Uri member = Uri.parse(attendee.getValue()); - String email = member.getSchemeSpecificPart(); - - Cn cn = (Cn)attendee.getParameter(Parameter.CN); + final Uri member = Uri.parse(attendee.getValue()); + final String email = member.getSchemeSpecificPart(); + + final Cn cn = (Cn)attendee.getParameter(Parameter.CN); if (cn != null) builder = builder.withValue(Attendees.ATTENDEE_NAME, cn.getValue()); - + int type = Attendees.TYPE_NONE; CuType cutype = (CuType)attendee.getParameter(Parameter.CUTYPE); @@ -760,7 +762,7 @@ public class LocalCalendar extends LocalCollection { * @param dates one more more lists of RDATE or EXDATE * @return formatted string for Android calendar provider */ - protected static String recurrenceSetsToAndroidString(List dates) { + static String recurrenceSetsToAndroidString(List dates) { String tzID = null; List strDates = new LinkedList();