Inline CalendarContract fields

pull/384/head
Alex Baker 8 years ago
parent 0af798b733
commit a1ebf24ff3

@ -7,6 +7,7 @@ import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.provider.CalendarContract;
import android.text.TextUtils;
import com.todoroo.andlib.utility.DateUtilities;
@ -26,20 +27,22 @@ import javax.inject.Inject;
import timber.log.Timber;
import static android.provider.BaseColumns._ID;
public class CalendarAlarmReceiver extends InjectingBroadcastReceiver {
public static final int REQUEST_CODE_CAL_REMINDER = 100;
public static final String BROADCAST_CALENDAR_REMINDER = Constants.PACKAGE + ".CALENDAR_EVENT";
private static final String[] EVENTS_PROJECTION = {
Calendars.EVENTS_DTSTART_COL,
Calendars.EVENTS_DTEND_COL,
Calendars.EVENTS_NAME_COL,
CalendarContract.Events.DTSTART,
CalendarContract.Events.DTEND,
CalendarContract.Events.TITLE,
};
private static final String[] ATTENDEES_PROJECTION = {
Calendars.ATTENDEES_NAME_COL,
Calendars.ATTENDEES_EMAIL_COL,
CalendarContract.Attendees.ATTENDEE_NAME,
CalendarContract.Attendees.ATTENDEE_EMAIL,
};
@Inject Preferences preferences;
@ -83,19 +86,18 @@ public class CalendarAlarmReceiver extends InjectingBroadcastReceiver {
private void showCalReminder(Context context, long eventId, boolean fromPostpone) {
ContentResolver cr = context.getContentResolver();
Uri eventUri = Calendars.getCalendarContentUri(Calendars.CALENDAR_CONTENT_EVENTS);
String[] eventArg = new String[] { Long.toString(eventId) };
Cursor event = cr.query(eventUri,
Cursor event = cr.query(CalendarContract.Events.CONTENT_URI,
EVENTS_PROJECTION,
Calendars.ID_COLUMN_NAME + " = ?",
_ID + " = ?",
eventArg,
null);
try {
if (event.moveToFirst()) {
int dtstartIndex = event.getColumnIndexOrThrow(Calendars.EVENTS_DTSTART_COL);
int dtendIndex = event.getColumnIndexOrThrow(Calendars.EVENTS_DTEND_COL);
int titleIndex = event.getColumnIndexOrThrow(Calendars.EVENTS_NAME_COL);
int dtstartIndex = event.getColumnIndexOrThrow(CalendarContract.Events.DTSTART);
int dtendIndex = event.getColumnIndexOrThrow(CalendarContract.Events.DTEND);
int titleIndex = event.getColumnIndexOrThrow(CalendarContract.Events.TITLE);
String title = event.getString(titleIndex);
long startTime = event.getLong(dtstartIndex);
@ -112,15 +114,15 @@ public class CalendarAlarmReceiver extends InjectingBroadcastReceiver {
if (shouldShowReminder) {
// Get attendees
Cursor attendees = cr.query(Calendars.getCalendarContentUri(Calendars.CALENDAR_CONTENT_ATTENDEES),
Cursor attendees = cr.query(CalendarContract.Attendees.CONTENT_URI,
ATTENDEES_PROJECTION,
Calendars.ATTENDEES_EVENT_ID_COL + " = ? ",
CalendarContract.Attendees.EVENT_ID + " = ? ",
eventArg,
null);
try {
// Do something with attendees
int emailIndex = attendees.getColumnIndexOrThrow(Calendars.ATTENDEES_EMAIL_COL);
int nameIndex = attendees.getColumnIndexOrThrow(Calendars.ATTENDEES_NAME_COL);
int emailIndex = attendees.getColumnIndexOrThrow(CalendarContract.Attendees.ATTENDEE_EMAIL);
int nameIndex = attendees.getColumnIndexOrThrow(CalendarContract.Attendees.ATTENDEE_NAME);
ArrayList<String> names = new ArrayList<>();
ArrayList<String> emails = new ArrayList<>();

@ -5,52 +5,23 @@
*/
package com.todoroo.astrid.gcal;
import android.net.Uri;
import android.provider.CalendarContract;
import javax.inject.Singleton;
import static android.provider.BaseColumns._ID;
@Singleton
public class Calendars {
public static final String CALENDAR_CONTENT_CALENDARS = "calendars";
public static final String CALENDAR_CONTENT_EVENTS = "events";
public static final String CALENDAR_CONTENT_ATTENDEES = "attendees";
public static final String ID_COLUMN_NAME = "_id";
public static final String CALENDARS_DISPLAY_COL = CalendarContract.Calendars.CALENDAR_DISPLAY_NAME;
public static final String EVENTS_DTSTART_COL = CalendarContract.Events.DTSTART;
public static final String EVENTS_DTEND_COL = CalendarContract.Events.DTEND;
public static final String EVENTS_NAME_COL = CalendarContract.Events.TITLE;
public static final String ATTENDEES_EVENT_ID_COL = CalendarContract.Attendees.EVENT_ID;
public static final String ATTENDEES_NAME_COL = CalendarContract.Attendees.ATTENDEE_NAME;
public static final String ATTENDEES_EMAIL_COL = CalendarContract.Attendees.ATTENDEE_EMAIL;
public static final String[] CALENDARS_PROJECTION = new String[] {
ID_COLUMN_NAME,
CALENDARS_DISPLAY_COL,
_ID,
CalendarContract.Calendars.CALENDAR_DISPLAY_NAME,
};
// Only show calendars that the user can modify. Access level 500
// corresponds to Calendars.CONTRIBUTOR_ACCESS
public static final String CALENDARS_WHERE = CalendarContract.Calendars.CALENDAR_ACCESS_LEVEL + ">= 500";
public static final String CALENDARS_SORT = CALENDARS_DISPLAY_COL + " ASC";
// --- api access
/** Return content uri for calendars
* @param table provider table, something like calendars, events
*/
public static Uri getCalendarContentUri(String table) {
switch (table) {
case CALENDAR_CONTENT_CALENDARS:
return CalendarContract.Calendars.CONTENT_URI;
case CALENDAR_CONTENT_EVENTS:
return CalendarContract.Events.CONTENT_URI;
case CALENDAR_CONTENT_ATTENDEES:
return CalendarContract.Attendees.CONTENT_URI;
}
return null;
}
public static final String CALENDARS_SORT = CalendarContract.Calendars.CALENDAR_DISPLAY_NAME + " ASC";
}

@ -11,6 +11,7 @@ import android.content.Context;
import android.database.Cursor;
import android.database.CursorIndexOutOfBoundsException;
import android.net.Uri;
import android.provider.CalendarContract;
import android.text.TextUtils;
import android.text.format.Time;
@ -30,15 +31,13 @@ import javax.inject.Inject;
import timber.log.Timber;
import static com.todoroo.astrid.gcal.Calendars.getCalendarContentUri;
import static android.provider.BaseColumns._ID;
public class GCalHelper {
/** If task has no estimated time, how early to set a task in calendar (seconds)*/
private static final long DEFAULT_CAL_TIME = DateUtilities.ONE_HOUR;
public static final String CALENDAR_ID_COLUMN = "calendar_id"; //$NON-NLS-1$
private final Context context;
private final TaskService taskService;
private final Preferences preferences;
@ -94,22 +93,21 @@ public class GCalHelper {
}
try{
Uri uri = getCalendarContentUri(Calendars.CALENDAR_CONTENT_EVENTS);
values.put("title", task.getTitle());
values.put("description", task.getNotes());
values.put("hasAlarm", 0);
boolean valuesContainCalendarId = (values.containsKey(CALENDAR_ID_COLUMN) &&
!TextUtils.isEmpty(values.getAsString(CALENDAR_ID_COLUMN)));
values.put(CalendarContract.Events.TITLE, task.getTitle());
values.put(CalendarContract.Events.DESCRIPTION, task.getNotes());
values.put(CalendarContract.Events.HAS_ALARM, 0);
boolean valuesContainCalendarId = (values.containsKey(CalendarContract.Events.CALENDAR_ID) &&
!TextUtils.isEmpty(values.getAsString(CalendarContract.Events.CALENDAR_ID)));
if (!valuesContainCalendarId) {
String calendarId = preferences.getDefaultCalendar();
if (!TextUtils.isEmpty(calendarId)) {
values.put("calendar_id", calendarId);
values.put(CalendarContract.Events.CALENDAR_ID, calendarId);
}
}
createStartAndEndDate(task, values);
Uri eventUri = cr.insert(uri, values);
Uri eventUri = cr.insert(CalendarContract.Events.CONTENT_URI, values);
cr.notifyChange(eventUri, null);
return eventUri;
@ -135,14 +133,14 @@ public class GCalHelper {
return;
}
ContentValues cv = new ContentValues();
cv.put(CALENDAR_ID_COLUMN, calendarId);
cv.put(CalendarContract.Events.CALENDAR_ID, calendarId);
Uri uri = createTaskEvent(task, cr, cv, false);
task.setCalendarUri(uri.toString());
}
private static String getCalendarId(Uri uri, ContentResolver cr) {
Cursor calendar = cr.query(uri, new String[]{CALENDAR_ID_COLUMN}, null, null, null);
Cursor calendar = cr.query(uri, new String[]{CalendarContract.Events.CALENDAR_ID}, null, null, null);
try {
calendar.moveToFirst();
return calendar.getString(0);
@ -173,7 +171,7 @@ public class GCalHelper {
// try to load calendar
ContentResolver cr = context.getContentResolver();
Cursor cursor = cr.query(calendarUri, new String[] { "dtstart" }, null, null, null); //$NON-NLS-1$
Cursor cursor = cr.query(calendarUri, new String[] { CalendarContract.Events.DTSTART }, null, null, null); //$NON-NLS-1$
try {
boolean alreadydeleted = cursor.getCount() == 0;
@ -206,40 +204,40 @@ public class GCalHelper {
estimatedTime = DEFAULT_CAL_TIME;
}
if (preferences.getBoolean(R.string.p_end_at_deadline, true)) {
values.put("dtstart", dueDate);
values.put("dtend", dueDate + estimatedTime);
values.put(CalendarContract.Events.DTSTART, dueDate);
values.put(CalendarContract.Events.DTEND, dueDate + estimatedTime);
}else{
values.put("dtstart", dueDate - estimatedTime);
values.put("dtend", dueDate);
values.put(CalendarContract.Events.DTSTART, dueDate - estimatedTime);
values.put(CalendarContract.Events.DTEND, dueDate);
}
// setting a duetime to a previously timeless event requires explicitly setting allDay=0
values.put("allDay", "0");
values.put("eventTimezone", TimeZone.getDefault().getID());
values.put(CalendarContract.Events.ALL_DAY, "0");
values.put(CalendarContract.Events.EVENT_TIMEZONE, TimeZone.getDefault().getID());
} else {
values.put("dtstart", tzCorrectedDueDate);
values.put("dtend", tzCorrectedDueDate);
values.put("allDay", "1");
values.put(CalendarContract.Events.DTSTART, tzCorrectedDueDate);
values.put(CalendarContract.Events.DTEND, tzCorrectedDueDate);
values.put(CalendarContract.Events.ALL_DAY, "1");
}
} else {
values.put("dtstart", tzCorrectedDueDateNow);
values.put("dtend", tzCorrectedDueDateNow);
values.put("allDay", "1");
values.put(CalendarContract.Events.DTSTART, tzCorrectedDueDateNow);
values.put(CalendarContract.Events.DTEND, tzCorrectedDueDateNow);
values.put(CalendarContract.Events.ALL_DAY, "1");
}
if ("1".equals(values.get("allDay"))) {
values.put("eventTimezone", Time.TIMEZONE_UTC);
if ("1".equals(values.get(CalendarContract.Events.ALL_DAY))) {
values.put(CalendarContract.Events.EVENT_TIMEZONE, Time.TIMEZONE_UTC);
} else {
values.put("eventTimezone", TimeZone.getDefault().getID());
values.put(CalendarContract.Events.EVENT_TIMEZONE, TimeZone.getDefault().getID());
}
}
public AndroidCalendar getCalendar(String id) {
ContentResolver cr = context.getContentResolver();
Cursor c = cr.query(getCalendarContentUri(Calendars.CALENDAR_CONTENT_CALENDARS), Calendars.CALENDARS_PROJECTION,
Cursor c = cr.query(CalendarContract.Calendars.CONTENT_URI, Calendars.CALENDARS_PROJECTION,
Calendars.CALENDARS_WHERE + " AND Calendars._id=" + id, null, Calendars.CALENDARS_SORT);
try {
if (c.moveToFirst()) {
int nameColumn = c.getColumnIndex(Calendars.CALENDARS_DISPLAY_COL);
int nameColumn = c.getColumnIndex(CalendarContract.Calendars.CALENDAR_DISPLAY_NAME);
String name = c.getString(nameColumn);
return new AndroidCalendar(id, name);
}
@ -258,7 +256,7 @@ public class GCalHelper {
public List<AndroidCalendar> getCalendars() {
ContentResolver cr = context.getContentResolver();
Cursor c = cr.query(getCalendarContentUri(Calendars.CALENDAR_CONTENT_CALENDARS), Calendars.CALENDARS_PROJECTION,
Cursor c = cr.query(CalendarContract.Calendars.CONTENT_URI, Calendars.CALENDARS_PROJECTION,
Calendars.CALENDARS_WHERE, null, Calendars.CALENDARS_SORT);
try {
List<AndroidCalendar> calendars = new ArrayList<>();
@ -269,8 +267,8 @@ public class GCalHelper {
return calendars;
}
int idColumn = c.getColumnIndex(Calendars.ID_COLUMN_NAME);
int nameColumn = c.getColumnIndex(Calendars.CALENDARS_DISPLAY_COL);
int idColumn = c.getColumnIndex(_ID);
int nameColumn = c.getColumnIndex(CalendarContract.Calendars.CALENDAR_DISPLAY_NAME);
while (c.moveToNext()) {
String id = c.getString(idColumn);
String name = c.getString(nameColumn);

@ -10,6 +10,7 @@ import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.provider.CalendarContract;
import android.text.TextUtils;
import com.todoroo.astrid.api.AstridApiConstants;
@ -47,7 +48,7 @@ public class GCalTaskCompleteListener extends InjectingBroadcastReceiver {
// change title of calendar event
ContentResolver cr = context.getContentResolver();
ContentValues values = new ContentValues();
values.put("title", context.getString(R.string.gcal_completed_title,
values.put(CalendarContract.Events.TITLE, context.getString(R.string.gcal_completed_title,
task.getTitle()));
cr.update(Uri.parse(calendarUri), values, null, null);
} catch (Exception e) {

@ -6,10 +6,10 @@ import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.provider.CalendarContract;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.gcal.CalendarAlarmReceiver;
import com.todoroo.astrid.gcal.Calendars;
import org.tasks.R;
import org.tasks.injection.ForApplication;
@ -20,6 +20,8 @@ import java.util.concurrent.TimeUnit;
import javax.inject.Inject;
import static android.provider.BaseColumns._ID;
public class CalendarNotificationIntentService extends RecurringIntervalIntentService {
public static final String URI_PREFIX = "cal-reminder";
@ -40,15 +42,15 @@ public class CalendarNotificationIntentService extends RecurringIntervalIntentSe
long now = DateUtilities.now();
Cursor events = cr.query(Calendars.getCalendarContentUri(Calendars.CALENDAR_CONTENT_EVENTS),
new String[] { Calendars.ID_COLUMN_NAME, Calendars.EVENTS_DTSTART_COL },
Calendars.EVENTS_DTSTART_COL + " > ? AND " + Calendars.EVENTS_DTSTART_COL + " < ?",
Cursor events = cr.query(CalendarContract.Events.CONTENT_URI,
new String[] {_ID, CalendarContract.Events.DTSTART},
CalendarContract.Events.DTSTART + " > ? AND " + CalendarContract.Events.DTSTART + " < ?",
new String[] { Long.toString(now + DateUtilities.ONE_MINUTE * 15), Long.toString(now + DateUtilities.ONE_DAY) },
null);
try {
if (events != null && events.getCount() > 0) {
int idIndex = events.getColumnIndex(Calendars.ID_COLUMN_NAME);
int dtstartIndex = events.getColumnIndexOrThrow(Calendars.EVENTS_DTSTART_COL);
int idIndex = events.getColumnIndex(_ID);
int dtstartIndex = events.getColumnIndexOrThrow(CalendarContract.Events.DTSTART);
for (events.moveToFirst(); !events.isAfterLast(); events.moveToNext()) {
Intent eventAlarm = new Intent(context, CalendarAlarmReceiver.class);

@ -10,6 +10,7 @@ import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.CalendarContract;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
@ -164,10 +165,10 @@ public class CalendarControlSet extends TaskEditControlFragment {
// check if we need to update the item
ContentValues setValues = task.getSetValues();
if(setValues.containsKey(Task.TITLE.name)) {
updateValues.put("title", task.getTitle());
updateValues.put(CalendarContract.Events.TITLE, task.getTitle());
}
if(setValues.containsKey(Task.NOTES.name)) {
updateValues.put("description", task.getNotes());
updateValues.put(CalendarContract.Events.DESCRIPTION, task.getNotes());
}
if(setValues.containsKey(Task.DUE_DATE.name) || setValues.containsKey(Task.ESTIMATED_SECONDS.name)) {
gcalHelper.createStartAndEndDate(task, updateValues);
@ -181,14 +182,14 @@ public class CalendarControlSet extends TaskEditControlFragment {
ContentResolver cr = context.getContentResolver();
try{
ContentValues values = new ContentValues();
values.put("calendar_id", calendarId);
values.put(CalendarContract.Events.CALENDAR_ID, calendarId);
Uri uri = gcalHelper.createTaskEvent(task, cr, values);
if(uri != null) {
task.setCalendarUri(uri.toString());
// pop up the new event
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.putExtra("beginTime", values.getAsLong("dtstart"));
intent.putExtra("endTime", values.getAsLong("dtend"));
intent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, values.getAsLong(CalendarContract.Events.DTSTART));
intent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, values.getAsLong(CalendarContract.Events.DTEND));
startActivity(intent);
}
} catch (Exception e) {
@ -247,7 +248,7 @@ public class CalendarControlSet extends TaskEditControlFragment {
ContentResolver cr = getActivity().getContentResolver();
Uri uri = Uri.parse(eventUri);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
Cursor cursor = cr.query(uri, new String[] { "dtstart", "dtend" }, null, null, null);
Cursor cursor = cr.query(uri, new String[] { CalendarContract.Events.DTSTART, CalendarContract.Events.DTEND }, null, null, null);
try {
if(cursor.getCount() == 0) {
// event no longer exists
@ -256,8 +257,8 @@ public class CalendarControlSet extends TaskEditControlFragment {
refreshDisplayView();
} else {
cursor.moveToFirst();
intent.putExtra("beginTime", cursor.getLong(0));
intent.putExtra("endTime", cursor.getLong(1));
intent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, cursor.getLong(0));
intent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, cursor.getLong(1));
startActivity(intent);
}
} catch (Exception e) {
@ -320,7 +321,7 @@ public class CalendarControlSet extends TaskEditControlFragment {
try {
Uri uri = Uri.parse(eventUri);
ContentResolver contentResolver = context.getContentResolver();
Cursor cursor = contentResolver.query(uri, new String[]{"dtstart"}, null, null, null);
Cursor cursor = contentResolver.query(uri, new String[]{CalendarContract.Events.DTSTART}, null, null, null);
try {
if (cursor.getCount() != 0) {
return true;

Loading…
Cancel
Save