package ca.etsmtl.applets.etsmobile.util;
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 android.util.Log;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
/**
* Created by gnut3ll4 on 6/23/14.
*/
public class AndroidCalendarManager {
private final Context context;
String[] projection = new String[] {
CalendarContract.Calendars._ID,
CalendarContract.Calendars.ACCOUNT_NAME,
CalendarContract.Calendars.CALENDAR_DISPLAY_NAME,
CalendarContract.Calendars.NAME,
CalendarContract.Calendars.CALENDAR_COLOR,
};
public AndroidCalendarManager(Context context){
this.context = context;
}
/**
* Create a calendar locally in the phone
* @param calendarName
*/
public void createCalendar(String calendarName){
ContentValues values = new ContentValues();
values.put(CalendarContract.Calendars.ACCOUNT_NAME, "Calendrier ApplETS");
values.put(CalendarContract.Calendars.ACCOUNT_TYPE, CalendarContract.ACCOUNT_TYPE_LOCAL);
values.put(CalendarContract.Calendars.NAME, calendarName);
values.put(CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, calendarName);
values.put(CalendarContract.Calendars.CALENDAR_COLOR, 0xffff0000);
values.put(CalendarContract.Calendars.CALENDAR_ACCESS_LEVEL, CalendarContract.Calendars.CAL_ACCESS_OWNER);
//values.put(CalendarContract.Calendars.OWNER_ACCOUNT, "test owner");
values.put(CalendarContract.Calendars.CALENDAR_TIME_ZONE, "America/Montreal");
values.put(CalendarContract.Calendars.VISIBLE, 1);
values.put(CalendarContract.Calendars.SYNC_EVENTS, 1);
Uri uri = CalendarContract.Calendars.CONTENT_URI.buildUpon()
.appendQueryParameter(android.provider.CalendarContract.CALLER_IS_SYNCADAPTER,"true")
.appendQueryParameter(CalendarContract.Calendars.ACCOUNT_NAME, "Calendrier ApplETS")
.appendQueryParameter(CalendarContract.Calendars.ACCOUNT_TYPE, CalendarContract.ACCOUNT_TYPE_LOCAL).build();;
context.getContentResolver().insert(uri, values);
}
/**
* Returns the id of the specified calendar
* @param calendarName
* @return id
*/
public int getCalendarId(String calendarName) throws Exception {
String selection = "(" + CalendarContract.Calendars.CALENDAR_DISPLAY_NAME+ " = ?)";
String[] selectionArgs = new String[] {calendarName};
Cursor calendarCursor = context.getContentResolver().query(CalendarContract.Calendars.CONTENT_URI, new String[] {CalendarContract.Calendars._ID,
CalendarContract.Calendars.ACCOUNT_NAME,
CalendarContract.Calendars.CALENDAR_DISPLAY_NAME,
CalendarContract.Calendars.NAME,
CalendarContract.Calendars.CALENDAR_COLOR}, selection, selectionArgs, null);
long id = 0;
if (calendarCursor.moveToFirst()) {
id = calendarCursor.getLong(0);
}
if(id==0) {
throw new Exception("Calendar not found");
}
return (int)id;
}
/**
* Returns a String containing details about an event in the specified calendar
* @param eventName
* @param calendarName
* @return
* @throws Exception
*/
public String getEventInCalendar(String eventName,String calendarName) throws Exception {
String response = "";
int idCal = getCalendarId(calendarName);
Uri uriEvents = CalendarContract.Events.CONTENT_URI;
String selection = "(" + CalendarContract.Events.CALENDAR_ID+ " = ?)";
String[] selectionArgs = new String[] {""+idCal};
Cursor c = context.getContentResolver().query(uriEvents, new String[] { "calendar_id", "title", "description",
"dtstart", "dtend", "event_location" }, selection, selectionArgs, null);
if (c.moveToFirst()) {
do {
long id = c.getLong(0);
String title = c.getString(1);
String description = c.getString(2);
long dtstart = c.getLong(3);
long dtend = c.getLong(4);
String eventLocation = c.getString(5);
response += id+" "+ title+" "+description+" "+dtstart+" "+dtend +"\n";
Log.e("selectAllEventFromCalendarById",id+"-"+title+"-"+description+"-"+dtstart+"-"+dtend+"-"+eventLocation);
} while (c.moveToNext());
}
return response;
}
/**
* Insert an event in the local calendar
* @param calendarName
* @param title
* @param description
* @param place
* @param start
* @param end
* @throws Exception
*/
public void insertEventInCalendar(String calendarName,String title,String description, String place, Date start, Date end) throws Exception {
int calendarId = getCalendarId(calendarName);
Calendar beginTime = Calendar.getInstance();
beginTime.setTime(start);
Calendar endTime = Calendar.getInstance();
endTime.setTime(end);
ContentValues values = new ContentValues();
values.put(CalendarContract.Events.DTSTART, beginTime.getTimeInMillis());
values.put(CalendarContract.Events.DTEND, endTime.getTimeInMillis());
values.put(CalendarContract.Events.TITLE, title);
values.put(CalendarContract.Events.DESCRIPTION, description);
values.put(CalendarContract.Events.EVENT_LOCATION, place);
values.put(CalendarContract.Events.CALENDAR_ID,calendarId );
values.put(CalendarContract.Events.EVENT_TIMEZONE, "America/Montreal");
context.getContentResolver().insert(CalendarContract.Events.CONTENT_URI, values);
}
/**
* Insert a recurrent event in the local calendar
* @param calendarName
* @param title
* @param description
* @param place
* @param startEvent
* @param endEvent
* @param until
* @throws Exception
*/
public void insertRecurrentEventInCalendar(String calendarName,String title,String description, String place, Date startEvent, Date endEvent, Date until) throws Exception {
int calendarId = getCalendarId(calendarName);
//années, mois (à partir de 0), jour, heure, minutes beginTime.set(2014,5, 23, 9, 30);
Calendar beginTime = Calendar.getInstance();
beginTime.setTime(startEvent);
Calendar endTime = Calendar.getInstance();
endTime.setTime(endEvent);
ContentValues values = new ContentValues();
values.put(CalendarContract.Events.DTSTART, beginTime.getTimeInMillis());
values.put(CalendarContract.Events.DTEND, endTime.getTimeInMillis());
values.put(CalendarContract.Events.TITLE, title);
values.put(CalendarContract.Events.DESCRIPTION, description);
values.put(CalendarContract.Events.EVENT_LOCATION, place);
values.put(CalendarContract.Events.CALENDAR_ID,calendarId );
SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyyMMdd");
values.put(CalendarContract.Events.RRULE,"FREQ=WEEKLY;UNTIL="+dateFormatter.format(until) );
values.put(CalendarContract.Events.EVENT_TIMEZONE, "America/Montreal");
context.getContentResolver().insert(CalendarContract.Events.CONTENT_URI, values);
}
/**
* Returns a string containing all user's calendars
* @return
*/
public String selectAllCalendars() {
Cursor calendarCursor = context.getContentResolver().query(CalendarContract.Calendars.CONTENT_URI, projection, null, null, null);
String response = "";
if (calendarCursor.moveToFirst()) {
do {
long id = calendarCursor.getLong(0);
String accountName = calendarCursor.getString(1);
String calendarDisplayName = calendarCursor.getString(2);
String name = calendarCursor.getString(3);
String calendarColor = calendarCursor.getString(4);
response += id+"-"+accountName+"-"+calendarDisplayName+"-"+name+"-"+calendarColor+"\n";
} while (calendarCursor.moveToNext());
}
return response;
}
/**
* Delete a local calendar
* @param calendarName
*/
public void deleteCalendar(String calendarName) {
try{
int calendarId = getCalendarId(calendarName);
Uri deleteUri = ContentUris.withAppendedId(CalendarContract.Calendars.CONTENT_URI, calendarId);
context.getContentResolver().delete(deleteUri, null, null);
}catch(Exception e) {
e.printStackTrace();
}
}
}