package io.github.memfis19.cadar.internal.utils; import android.content.ContentResolver; import android.content.ContentUris; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.provider.CalendarContract; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.joda.time.format.DateTimeFormat; import java.util.Calendar; import java.util.TimeZone; import io.github.memfis19.cadar.data.entity.Event; import io.github.memfis19.cadar.data.entity.property.EventProperties; /** * Created by memfis on 3/25/15. */ public class SyncUtils { public static String getCalendarUriBase(Context context) { String calendarUriBase = null; Uri calendars = Uri.parse("content://calendar/calendars"); Cursor cursor = null; try { cursor = context.getContentResolver().query(calendars, null, null, null, null); } catch (Exception e) { // eat } if (cursor != null) { calendarUriBase = "content://calendar/"; } else { calendars = Uri.parse("content://com.android.calendar/calendars"); try { cursor = context.getContentResolver().query(calendars, null, null, null, null); } catch (Exception e) { // eat } if (cursor != null) { calendarUriBase = "content://com.android.calendar/"; } } if (cursor != null) { cursor.close(); } return calendarUriBase; } public static boolean deleteEvent(Context context, long calendarId) { ContentResolver contentResolver = context.getContentResolver(); Uri eventsUri = Uri.parse(getCalendarUriBase(context) + "events"); return contentResolver.delete(eventsUri, CalendarContract.Events._ID + "=" + calendarId, null) == 1; } /** * Insert passed event to the device calendar with according start/end dates and repeat period * * @param context - activity context. * @param event - event to insert. * @return - return created event id generated by device calendar or 0 it insert was not executed. * @see EventProperties.RepeatPeriod * use rfc2445 (iCalendar) protocol to describe event. */ public static long insertEvent(Context context, Event event) { if (event == null) return 0; ContentResolver contentResolver = context.getContentResolver(); ContentValues values = new ContentValues(); Calendar eventCalendar = DateUtils.getCalendarInstance(); eventCalendar.setTime(event.getEventStartDate()); eventCalendar.set(Calendar.HOUR_OF_DAY, 23); eventCalendar.set(Calendar.MINUTE, 59); eventCalendar.set(Calendar.SECOND, 59); eventCalendar.set(Calendar.MILLISECOND, 999); values.put(CalendarContract.Events.DTSTART, event.getOriginalEventStartDate().getTime()); values.put(CalendarContract.Events.RRULE, getRepeatRule(event)); values.put(CalendarContract.Events.DURATION, "+P1H"); values.put(CalendarContract.Events.TITLE, event.getEventTitle()); values.put(CalendarContract.Events.DESCRIPTION, event.getEventDescription()); values.put(CalendarContract.Events.CALENDAR_ID, 1); values.put(CalendarContract.Events.EVENT_TIMEZONE, TimeZone.getDefault().getID()); Uri eventsUri = Uri.parse(getCalendarUriBase(context) + "events"); Uri uri = contentResolver.insert(eventsUri, values); if (uri != null) { return Long.parseLong(uri.getLastPathSegment()); } return 0; } /** * Update passed event if exist in the device calendar * * @param context - activity context. * @param event - event to insert. * @return - return the number of rows updated or 0 if update was not executed. */ public static int updateEvent(Context context, Event event) { if (event == null) return 0; ContentResolver contentResolver = context.getContentResolver(); Uri eventsUri = Uri.parse(getCalendarUriBase(context) + "events"); Uri eventUri = ContentUris.withAppendedId(eventsUri, event.getCalendarId()); if (eventUri == null) return 0; ContentValues values = new ContentValues(); Calendar eventCalendar = DateUtils.getCalendarInstance(); eventCalendar.setTime(event.getEventStartDate()); eventCalendar.set(Calendar.HOUR_OF_DAY, 23); eventCalendar.set(Calendar.MINUTE, 59); eventCalendar.set(Calendar.SECOND, 59); eventCalendar.set(Calendar.MILLISECOND, 999); values.put(CalendarContract.Events.DTSTART, event.getEventStartDate().getTime()); values.put(CalendarContract.Events.RRULE, getRepeatRule(event)); values.put(CalendarContract.Events.DURATION, "+P1H"); values.put(CalendarContract.Events.TITLE, event.getEventTitle()); values.put(CalendarContract.Events.DESCRIPTION, event.getEventDescription()); values.put(CalendarContract.Events.CALENDAR_ID, 1); values.put(CalendarContract.Events.EVENT_TIMEZONE, TimeZone.getDefault().getID()); return contentResolver.update(eventUri, values, null, null); } /** * Return rfc2445 repeat period according to the event repeat period * * @param event - event to process. * @return - string with according rfc2445 repeat period. * @see EventProperties.RepeatPeriod */ public static String getRepeatRule(Event event) { int repeatPeriod = event.getEventRepeatPeriod(); if (event.getEventEndDate() == null) { event.setEventEndDate(event.getEventStartDate()); } StringBuffer result = new StringBuffer("FREQ="); if (EventProperties.EVERY_WEEK == repeatPeriod) { result.append("WEEKLY"); } else if (EventProperties.EVERY_2_WEEK == repeatPeriod) { result.append("WEEKLY;INTERVAL=2"); } else if (EventProperties.EVERY_3_WEEK == repeatPeriod) { result.append("WEEKLY;INTERVAL=3"); } else if (EventProperties.EVERY_4_WEEK == repeatPeriod) { result.append("WEEKLY;INTERVAL=4"); } else if (EventProperties.EVERY_MONTH == repeatPeriod) { result.append("MONTHLY"); } else if (EventProperties.EVERY_YEAR == repeatPeriod) { result.append("YEARLY"); } else { if (event.getEventEndDate() == null) event.setEventEndDate(event.getEventStartDate()); result.append("DAILY"); } if (event.getEventEndDate() != null) { DateTime dateTime = new DateTime(event.getEventEndDate(), DateTimeZone.UTC); String utcDateTime = dateTime.toString(DateTimeFormat.forPattern("yyyyMMdd'T'HHmmss'Z'")); result.append(";UNTIL="); result.append(utcDateTime); } if (EventProperties.EVERY_MONTH == repeatPeriod && DateUtils.isLastDayOfTheMonth(event.getEventStartDate())) { result.append(";BYMONTHDAY=-1"); } return result.toString(); } }