Improve handling of exception downsync

* We needed to copy some more columns, and also copy reminders
  and attendees to the Exception
* Also found a bug in which Description was referenced as a boolean
  rather than a String

Bug: 2511405
Change-Id: I485b8d44a6090f8190e681838d2141551227d8f3
This commit is contained in:
Marc Blank 2010-03-12 17:54:02 -08:00
parent 82e51e0631
commit 4b3c683014

View File

@ -246,6 +246,11 @@ public class CalendarSyncAdapter extends AbstractSyncAdapter {
long eventId = -1;
long startTime = -1;
long endTime = -1;
// Keep track of the attendees; exceptions will need them
ArrayList<ContentValues> attendeeValues = null;
int reminderMins = -1;
while (nextTag(Tags.SYNC_APPLICATION_DATA) != END) {
if (update && firstTag) {
// Find the event that's being updated
@ -292,7 +297,7 @@ public class CalendarSyncAdapter extends AbstractSyncAdapter {
break;
case Tags.CALENDAR_ATTENDEES:
// If eventId >= 0, this is an update; otherwise, a new Event
attendeesParser(ops, eventId);
attendeeValues = attendeesParser(ops, eventId);
break;
case Tags.BASE_BODY:
cv.put(Events.DESCRIPTION, bodyParser());
@ -317,7 +322,7 @@ public class CalendarSyncAdapter extends AbstractSyncAdapter {
endTime = Utility.parseDateTimeToMillis(getValue());
break;
case Tags.CALENDAR_EXCEPTIONS:
exceptionsParser(ops, cv);
exceptionsParser(ops, cv, attendeeValues, reminderMins);
break;
case Tags.CALENDAR_LOCATION:
cv.put(Events.EVENT_LOCATION, getValue());
@ -342,7 +347,8 @@ public class CalendarSyncAdapter extends AbstractSyncAdapter {
organizerName = getValue();
break;
case Tags.CALENDAR_REMINDER_MINS_BEFORE:
ops.newReminder(getValueInt());
reminderMins = getValueInt();
ops.newReminder(reminderMins);
cv.put(Events.HAS_ALARM, 1);
break;
// The following are fields we should save (for changes), though they don't
@ -496,8 +502,8 @@ public class CalendarSyncAdapter extends AbstractSyncAdapter {
dow, dom, wom, moy, until);
}
private void exceptionParser(CalendarOperations ops, ContentValues parentCv)
throws IOException {
private void exceptionParser(CalendarOperations ops, ContentValues parentCv,
ArrayList<ContentValues> attendeeValues, int reminderMins) throws IOException {
ContentValues cv = new ContentValues();
cv.put(Events.CALENDAR_ID, mCalendarId);
cv.put(Events._SYNC_ACCOUNT, mAccount.mEmailAddress);
@ -507,8 +513,10 @@ public class CalendarSyncAdapter extends AbstractSyncAdapter {
// Note that they can be overridden below
cv.put(Events.ORGANIZER, parentCv.getAsString(Events.ORGANIZER));
cv.put(Events.TITLE, parentCv.getAsString(Events.TITLE));
cv.put(Events.DESCRIPTION, parentCv.getAsBoolean(Events.DESCRIPTION));
cv.put(Events.DESCRIPTION, parentCv.getAsString(Events.DESCRIPTION));
cv.put(Events.ORIGINAL_ALL_DAY, parentCv.getAsInteger(Events.ALL_DAY));
cv.put(Events.EVENT_LOCATION, parentCv.getAsString(Events.EVENT_LOCATION));
cv.put(Events.VISIBILITY, parentCv.getAsString(Events.VISIBILITY));
// This column is the key that links the exception to the serverId
// TODO Make sure calendar knows this isn't globally unique!!
@ -587,10 +595,18 @@ public class CalendarSyncAdapter extends AbstractSyncAdapter {
if (!cv.containsKey(Events.DTEND)) {
cv.put(Events.DTEND, parentCv.getAsLong(Events.DTEND));
}
// TODO See if this is necessary
//cv.put(Events.LAST_DATE, cv.getAsLong(Events.DTEND));
// Add the exception insert
int exceptionStart = ops.mCount;
ops.newException(cv);
// Also add the attendees, because they need to be copied over from the parent event
for (ContentValues attValues: attendeeValues) {
ops.newAttendee(attValues, exceptionStart);
}
// And add the parent's reminder value
if (reminderMins > 0) {
ops.newReminder(reminderMins, exceptionStart);
}
}
private int encodeVisibility(int easVisibility) {
@ -612,12 +628,12 @@ public class CalendarSyncAdapter extends AbstractSyncAdapter {
return visibility;
}
private void exceptionsParser(CalendarOperations ops, ContentValues cv)
throws IOException {
private void exceptionsParser(CalendarOperations ops, ContentValues cv,
ArrayList<ContentValues> attendeeValues, int reminderMins) throws IOException {
while (nextTag(Tags.CALENDAR_EXCEPTIONS) != END) {
switch (tag) {
case Tags.CALENDAR_EXCEPTION:
exceptionParser(ops, cv);
exceptionParser(ops, cv, attendeeValues, reminderMins);
break;
default:
skipTag();
@ -642,19 +658,23 @@ public class CalendarSyncAdapter extends AbstractSyncAdapter {
return categories.toString();
}
private void attendeesParser(CalendarOperations ops, long eventId) throws IOException {
private ArrayList<ContentValues> attendeesParser(CalendarOperations ops, long eventId)
throws IOException {
ArrayList<ContentValues> attendeeValues = new ArrayList<ContentValues>();
while (nextTag(Tags.CALENDAR_ATTENDEES) != END) {
switch (tag) {
case Tags.CALENDAR_ATTENDEE:
attendeeParser(ops, eventId);
attendeeValues.add(attendeeParser(ops, eventId));
break;
default:
skipTag();
}
}
return attendeeValues;
}
private void attendeeParser(CalendarOperations ops, long eventId) throws IOException {
private ContentValues attendeeParser(CalendarOperations ops, long eventId)
throws IOException {
ContentValues cv = new ContentValues();
while (nextTag(Tags.CALENDAR_ATTENDEE) != END) {
switch (tag) {
@ -696,6 +716,7 @@ public class CalendarSyncAdapter extends AbstractSyncAdapter {
} else {
ops.updatedAttendee(cv, eventId);
}
return cv;
}
private String bodyParser() throws IOException {
@ -966,10 +987,14 @@ public class CalendarSyncAdapter extends AbstractSyncAdapter {
}
public void newAttendee(ContentValues cv) {
newAttendee(cv, mEventStart);
}
public void newAttendee(ContentValues cv, int eventStart) {
add(ContentProviderOperation
.newInsert(sAttendeesUri)
.withValues(cv)
.withValueBackReference(Attendees.EVENT_ID, mEventStart)
.withValueBackReference(Attendees.EVENT_ID, eventStart)
.build());
}
@ -991,15 +1016,19 @@ public class CalendarSyncAdapter extends AbstractSyncAdapter {
.build());
}
public void newReminder(int mins) {
public void newReminder(int mins, int eventStart) {
add(ContentProviderOperation
.newInsert(sRemindersUri)
.withValue(Reminders.MINUTES, mins)
.withValue(Reminders.METHOD, Reminders.METHOD_DEFAULT)
.withValueBackReference(ExtendedProperties.EVENT_ID, mEventStart)
.withValueBackReference(ExtendedProperties.EVENT_ID, eventStart)
.build());
}
public void newReminder(int mins) {
newReminder(mins, mEventStart);
}
public void delete(long id) {
add(ContentProviderOperation
.newDelete(ContentUris.withAppendedId(sEventsUri, id)).build());