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();
}
}