diff -r 000000000000 -r fb9019fb1bf7 src/org/gege/caldavsyncadapter/Event.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/org/gege/caldavsyncadapter/Event.java Tue Feb 10 18:12:00 2015 +0100 @@ -0,0 +1,184 @@ +/** + * Copyright (c) 2012-2013, Gerald Garcia, Timo Berger + * + * This file is part of Andoid Caldav Sync Adapter Free. + * + * Andoid Caldav Sync Adapter Free is free software: you can redistribute + * it and/or modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the + * License, or at your option any later version. + * + * Andoid Caldav Sync Adapter Free is distributed in the hope that + * it will be useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Andoid Caldav Sync Adapter Free. + * If not, see . + * + */ +package org.gege.caldavsyncadapter; + +import android.content.ContentValues; +import android.provider.CalendarContract.Events; +import android.util.Log; + +/** + * abstract class for Calendar and Android events + */ +abstract public class Event { + private static final String TAG = "Event"; + + /** + * stores the ETAG of an event + */ + public static String ETAG = Events.SYNC_DATA1; + + /** + * internal Tag used to identify deleted events + */ + public static String INTERNALTAG = Events.SYNC_DATA2; + + /** + * store the whole VEVENT in here + * missing TAGs they might be missing for google update + * + * CREATED:20130906T102857Z + * DTSTAMP:20130906T102857Z + * LAST-MODIFIED:20130906T102857Z + * SEQUENCE:0 + */ + public static String RAWDATA = Events.SYNC_DATA3; + + /** + * stores the UID of an Event + * example: UID:e6be67c6-eff0-44f8-a1a0-6c2cb1029944-caldavsyncadapter + */ + public static String UID = Events.SYNC_DATA4; + + /** + * the event transformed into ContentValues + */ + public ContentValues ContentValues = new ContentValues(); + + abstract public String getETag(); + abstract public void setETag(String ETag); + + /** + * returns a list of all items that are comparable with this sync adapter + * @return a list of all items that are comparable with this sync adapter + */ + public static java.util.ArrayList getComparableItems() { + java.util.ArrayList Result = new java.util.ArrayList(); + Result.add(Events.DTSTART); + Result.add(Events.DTEND); + Result.add(Events.EVENT_TIMEZONE); + Result.add(Events.EVENT_END_TIMEZONE); + Result.add(Events.ALL_DAY); + Result.add(Events.DURATION); + Result.add(Events.TITLE); + Result.add(Events.CALENDAR_ID); + Result.add(Events._SYNC_ID); + //Result.add(Events.SYNC_DATA1); + Result.add(ETAG); + Result.add(Events.DESCRIPTION); + Result.add(Events.EVENT_LOCATION); + Result.add(Events.ACCESS_LEVEL); + Result.add(Events.STATUS); + Result.add(Events.RDATE); + Result.add(Events.RRULE); + Result.add(Events.EXRULE); + Result.add(Events.EXDATE); + Result.add(UID); + + return Result; + } + + /** + * sets the AndroidCalendarId for this event + * @param ID the AndroidCalendarId for this event + */ + public void setAndroidCalendarId(long ID) { + if (this.ContentValues.containsKey(Events.CALENDAR_ID)) + this.ContentValues.remove(Events.CALENDAR_ID); + + this.ContentValues.put(Events.CALENDAR_ID, ID); + } + + /** + * returns the AndroidCalendarId for this event. + * @return the AndroidCalendarId for this event + */ + public long getAndroidCalendarId() { + long Result = -1; + if (this.ContentValues.containsKey(Events.CALENDAR_ID)) + Result = this.ContentValues.getAsLong(Events.CALENDAR_ID); + return Result; + } + + /** + * returns the UID for this event. you can also check, whether the UID was stored from server. the V1.7 release and before didn't save them. + * example: UID:e6be67c6-eff0-44f8-a1a0-6c2cb1029944-caldavsyncadapter + * @return the UID for this event + */ + public String getUID() { + String Result = ""; + if (this.ContentValues.containsKey(UID)) + Result = this.ContentValues.getAsString(UID); + + return Result; + } + + /** + * compares the given ContentValues with the current ones for differences + * @param calendarEventValues the contentValues of the calendar event + * @return if the events are different + */ + public boolean checkEventValuesChanged(ContentValues calendarEventValues) { + boolean Result = false; + Object ValueAndroid = null; + Object ValueCalendar = null; + java.util.ArrayList CompareItems = Event.getComparableItems(); + + for (String Key: CompareItems) { + + if (this.ContentValues.containsKey(Key)) + ValueAndroid = this.ContentValues.get(Key); + else + ValueAndroid = null; + + if (calendarEventValues.containsKey(Key)) + ValueCalendar = calendarEventValues.get(Key); + else + ValueCalendar = null; + + /* + * TODO: Sync is designed to "Server always wins", should be a general option for this adapter + */ + if (ValueAndroid != null) { + if (ValueCalendar != null) { + if (!ValueAndroid.toString().equals(ValueCalendar.toString())) { + Log.d(TAG, "difference in " + Key.toString() + ":" + ValueAndroid.toString() + " <> " + ValueCalendar.toString()); + this.ContentValues.put(Key,ValueCalendar.toString()); + Result = true; + } + } else { + Log.d(TAG, "difference in " + Key.toString() + ":" + ValueAndroid.toString() + " <> null"); + this.ContentValues.putNull(Key); + Result = true; + } + } else { + if (ValueCalendar != null) { + Log.d(TAG, "difference in " + Key.toString() + ":null <> " + ValueCalendar.toString()); + this.ContentValues.put(Key, ValueCalendar.toString()); + Result = true; + } else { + // both null -> this is ok + } + } + } + + return Result; + } +}