From 095eee41565900a2509256ffcbf6cd67a4c4e345 Mon Sep 17 00:00:00 2001 From: Marc Blank Date: Thu, 15 Apr 2010 20:46:10 -0700 Subject: [PATCH] Set selfAttendeeStatus and busyStatus properly on downsync/upsync * Set selfAttendeeStatus on download from busy status * Set busyStatus on upload from selfAttendeeStatus Bug: 2587076 Change-Id: I34eaa0d3861bcec0cbfd51761b31965e44f5162b --- .../exchange/adapter/CalendarSyncAdapter.java | 23 ++++---- .../exchange/utility/CalendarUtilities.java | 54 +++++++++++++++++++ .../utility/CalendarUtilitiesTests.java | 33 ++++++++++++ 3 files changed, 99 insertions(+), 11 deletions(-) diff --git a/src/com/android/exchange/adapter/CalendarSyncAdapter.java b/src/com/android/exchange/adapter/CalendarSyncAdapter.java index 3eab4fbfc..30549da69 100644 --- a/src/com/android/exchange/adapter/CalendarSyncAdapter.java +++ b/src/com/android/exchange/adapter/CalendarSyncAdapter.java @@ -97,8 +97,6 @@ public class CalendarSyncAdapter extends AbstractSyncAdapter { private static final String CATEGORY_TOKENIZER_DELIMITER = "\\"; private static final String ATTENDEE_TOKENIZER_DELIMITER = CATEGORY_TOKENIZER_DELIMITER; - private static final String FREE_BUSY_BUSY = "2"; - private static final ContentProviderOperation PLACEHOLDER_OPERATION = ContentProviderOperation.newInsert(Uri.EMPTY).build(); @@ -411,7 +409,9 @@ public class CalendarSyncAdapter extends AbstractSyncAdapter { ops.newExtendedProperty("meeting_status", getValue()); break; case Tags.CALENDAR_BUSY_STATUS: - ops.newExtendedProperty("busy_status", getValue()); + int busyStatus = getValueInt(); + cv.put(Events.SELF_ATTENDEE_STATUS, + CalendarUtilities.selfAttendeeStatusFromBusyStatus(busyStatus)); break; case Tags.CALENDAR_CATEGORIES: String categories = categoriesParser(ops); @@ -618,21 +618,19 @@ public class CalendarSyncAdapter extends AbstractSyncAdapter { case Tags.CALENDAR_SENSITIVITY: cv.put(Events.VISIBILITY, encodeVisibility(getValueInt())); break; + case Tags.CALENDAR_BUSY_STATUS: + int busyStatus = getValueInt(); + cv.put(Events.SELF_ATTENDEE_STATUS, + CalendarUtilities.selfAttendeeStatusFromBusyStatus(busyStatus)); + break; // TODO How to handle these items that are linked to event id! - // case Tags.CALENDAR_DTSTAMP: // ops.newExtendedProperty("dtstamp", getValue()); // break; -// case Tags.CALENDAR_BUSY_STATUS: -// // TODO Try to fit this into Calendar scheme -// ops.newExtendedProperty("busy_status", getValue()); -// break; // case Tags.CALENDAR_REMINDER_MINS_BEFORE: // ops.newReminder(getValueInt()); // break; - - // Not yet handled default: skipTag(); } @@ -1173,7 +1171,10 @@ public class CalendarSyncAdapter extends AbstractSyncAdapter { // Busy status is only required for 2.5, but we need to send it with later // versions as well, because if we don't, the server will clear it. - s.data(Tags.CALENDAR_BUSY_STATUS, FREE_BUSY_BUSY); + int selfAttendeeStatus = entityValues.getAsInteger(Events.SELF_ATTENDEE_STATUS); + s.data(Tags.CALENDAR_BUSY_STATUS, + Integer.toString(CalendarUtilities + .busyStatusFromSelfAttendeeStatus(selfAttendeeStatus))); boolean allDay = false; if (entityValues.containsKey(Events.ALL_DAY)) { diff --git a/src/com/android/exchange/utility/CalendarUtilities.java b/src/com/android/exchange/utility/CalendarUtilities.java index 35e42e141..263b13613 100644 --- a/src/com/android/exchange/utility/CalendarUtilities.java +++ b/src/com/android/exchange/utility/CalendarUtilities.java @@ -137,6 +137,11 @@ public class CalendarUtilities { static final String ICALENDAR_ATTENDEE_TENTATIVE = ICALENDAR_ATTENDEE + ";PARTSTAT=TENTATIVE"; + public static final int BUSY_STATUS_BUSY = 0; + public static final int BUSY_STATUS_FREE = 1; + public static final int BUSY_STATUS_TENTATIVE = 2; + public static final int BUSY_STATUS_OOF = 3; + // Return a 4-byte long from a byte array (little endian) static int getLong(byte[] bytes, int offset) { return (bytes[offset++] & 0xFF) | ((bytes[offset++] & 0xFF) << 8) | @@ -1210,6 +1215,55 @@ public class CalendarUtilities { } } + /** + * Get a selfAttendeeStatus from a busy status + * The default here is NONE (i.e. we don't know the status) + * Note that a busy status of FREE must mean NONE as well, since it can't mean declined + * (there would be no event) + * @param busyStatus the busy status, from EAS + * @return the corresponding value for selfAttendeeStatus + */ + static public int selfAttendeeStatusFromBusyStatus(int busyStatus) { + int selfAttendeeStatus; + switch (busyStatus) { + case BUSY_STATUS_BUSY: + selfAttendeeStatus = Attendees.ATTENDEE_STATUS_ACCEPTED; + break; + case BUSY_STATUS_TENTATIVE: + selfAttendeeStatus = Attendees.ATTENDEE_STATUS_TENTATIVE; + break; + case BUSY_STATUS_FREE: + case BUSY_STATUS_OOF: + default: + selfAttendeeStatus = Attendees.ATTENDEE_STATUS_NONE; + } + return selfAttendeeStatus; + } + + /** Get a busy status from a selfAttendeeStatus + * The default here is BUSY + * @param selfAttendeeStatus from CalendarProvider2 + * @return the corresponding value of busy status + */ + static public int busyStatusFromSelfAttendeeStatus(int selfAttendeeStatus) { + int busyStatus; + switch (selfAttendeeStatus) { + case Attendees.ATTENDEE_STATUS_DECLINED: + case Attendees.ATTENDEE_STATUS_NONE: + case Attendees.ATTENDEE_STATUS_INVITED: + busyStatus = BUSY_STATUS_FREE; + break; + case Attendees.ATTENDEE_STATUS_TENTATIVE: + busyStatus = BUSY_STATUS_TENTATIVE; + break; + case Attendees.ATTENDEE_STATUS_ACCEPTED: + default: + busyStatus = BUSY_STATUS_BUSY; + break; + } + return busyStatus; + } + static public String buildMessageTextFromEntityValues(Context context, ContentValues entityValues, StringBuilder sb) { if (sb == null) { diff --git a/tests/src/com/android/exchange/utility/CalendarUtilitiesTests.java b/tests/src/com/android/exchange/utility/CalendarUtilitiesTests.java index 20916e745..c99fa4be2 100644 --- a/tests/src/com/android/exchange/utility/CalendarUtilitiesTests.java +++ b/tests/src/com/android/exchange/utility/CalendarUtilitiesTests.java @@ -714,6 +714,39 @@ public class CalendarUtilitiesTests extends AndroidTestCase { assertEquals(uid, "040000008200E00074C5B7101A82E00800000000C0093BBB29B3CA" + "01000000000000000010000000E6E0B06E8756DD459B2FBB1A52DB1A16"); } + + public void testSelfAttendeeStatusFromBusyStatus() { + assertEquals(Attendees.ATTENDEE_STATUS_ACCEPTED, + CalendarUtilities.selfAttendeeStatusFromBusyStatus( + CalendarUtilities.BUSY_STATUS_BUSY)); + assertEquals(Attendees.ATTENDEE_STATUS_TENTATIVE, + CalendarUtilities.selfAttendeeStatusFromBusyStatus( + CalendarUtilities.BUSY_STATUS_TENTATIVE)); + assertEquals(Attendees.ATTENDEE_STATUS_NONE, + CalendarUtilities.selfAttendeeStatusFromBusyStatus( + CalendarUtilities.BUSY_STATUS_FREE)); + assertEquals(Attendees.ATTENDEE_STATUS_NONE, + CalendarUtilities.selfAttendeeStatusFromBusyStatus( + CalendarUtilities.BUSY_STATUS_OOF)); + } + + public void testBusyStatusFromSelfStatus() { + assertEquals(CalendarUtilities.BUSY_STATUS_FREE, + CalendarUtilities.busyStatusFromSelfAttendeeStatus( + Attendees.ATTENDEE_STATUS_DECLINED)); + assertEquals(CalendarUtilities.BUSY_STATUS_BUSY, + CalendarUtilities.busyStatusFromSelfAttendeeStatus( + Attendees.ATTENDEE_STATUS_NONE)); + assertEquals(CalendarUtilities.BUSY_STATUS_BUSY, + CalendarUtilities.busyStatusFromSelfAttendeeStatus( + Attendees.ATTENDEE_STATUS_INVITED)); + assertEquals(CalendarUtilities.BUSY_STATUS_TENTATIVE, + CalendarUtilities.busyStatusFromSelfAttendeeStatus( + Attendees.ATTENDEE_STATUS_TENTATIVE)); + assertEquals(CalendarUtilities.BUSY_STATUS_BUSY, + CalendarUtilities.busyStatusFromSelfAttendeeStatus( + Attendees.ATTENDEE_STATUS_ACCEPTED)); + } } // TODO Planned unit tests