diff --git a/astrid/astrid.launch b/astrid/astrid.launch
index 6b1f50845..065607e32 100644
--- a/astrid/astrid.launch
+++ b/astrid/astrid.launch
@@ -6,7 +6,6 @@
-
diff --git a/astrid/plugin-src/com/todoroo/astrid/gcal/Calendars.java b/astrid/plugin-src/com/todoroo/astrid/gcal/Calendars.java
index 1b802cc87..e68e141f1 100644
--- a/astrid/plugin-src/com/todoroo/astrid/gcal/Calendars.java
+++ b/astrid/plugin-src/com/todoroo/astrid/gcal/Calendars.java
@@ -7,11 +7,15 @@ import android.database.Cursor;
import android.net.Uri;
import com.timsu.astrid.R;
+import com.todoroo.andlib.service.ContextManager;
import com.todoroo.astrid.utility.Preferences;
@SuppressWarnings("nls")
public class Calendars {
+ public static final String CALENDAR_CONTENT_CALENDARS = "calendars";
+ public static final String CALENDAR_CONTENT_EVENTS = "events";
+
private static final String ID_COLUMN_NAME = "_id";
private static final String DISPLAY_COLUMN_NAME = "displayName";
private static final String ACCES_LEVEL_COLUMN_NAME = "access_level";
@@ -29,12 +33,14 @@ public class Calendars {
// --- api access
- /** Return content uri for calendars */
- public static Uri getCalendarContentUri() {
+ /** Return content uri for calendars
+ * @param table provider table, something like calendars, events
+ */
+ public static Uri getCalendarContentUri(String table) {
if(android.os.Build.VERSION.SDK_INT >= 8)
- return Uri.parse("content://com.android.calendar/calendars");
+ return Uri.parse("content://com.android.calendar/" + table);
else
- return Uri.parse("content://calendar/calendars");
+ return Uri.parse("content://calendar/" + table);
}
/** Return calendar package name */
@@ -57,8 +63,8 @@ public class Calendars {
/** calendar ids. null entry -> use default */
public String[] calendarIds;
- /** selected index */
- public int selectedIndex = -1;
+ /** default selection index */
+ public int defaultIndex = -1;
}
/**
@@ -71,11 +77,11 @@ public class Calendars {
* @param listPreference
* preference to init
*/
- public static CalendarResult getCalendars(Context context) {
-
+ public static CalendarResult getCalendars() {
+ Context context = ContextManager.getContext();
ContentResolver cr = context.getContentResolver();
Resources r = context.getResources();
- Cursor c = cr.query(getCalendarContentUri(), CALENDARS_PROJECTION,
+ Cursor c = cr.query(getCalendarContentUri(CALENDAR_CONTENT_CALENDARS), CALENDARS_PROJECTION,
CALENDARS_WHERE, null, CALENDARS_SORT);
// Fetch the current setting. Invalid calendar id will
@@ -90,7 +96,7 @@ public class Calendars {
result.calendars = new String[] {
r.getString(R.string.gcal_GCP_default) };
result.calendarIds = new String[] { null };
- result.selectedIndex = 0;
+ result.defaultIndex = 0;
return result;
}
@@ -112,14 +118,14 @@ public class Calendars {
// We found currently selected calendar
if (defaultSetting != null && defaultSetting.equals(id)) {
- result.selectedIndex = row;
+ result.defaultIndex = row;
}
row++;
}
- if (result.selectedIndex == -1 || result.selectedIndex >= calendarCount) {
- result.selectedIndex = 0;
+ if (result.defaultIndex == -1 || result.defaultIndex >= calendarCount) {
+ result.defaultIndex = 0;
}
return result;
@@ -128,4 +134,12 @@ public class Calendars {
}
}
+ /**
+ * sets the default calendar for future use
+ * @param defaultCalendar default calendar id
+ */
+ public static void setDefaultCalendar(String defaultCalendar) {
+ Preferences.setString(R.string.gcal_p_default, defaultCalendar);
+ }
+
}
\ No newline at end of file
diff --git a/astrid/plugin-src/com/todoroo/astrid/gcal/GCalControlSet.java b/astrid/plugin-src/com/todoroo/astrid/gcal/GCalControlSet.java
index 52c9b6078..ffa768577 100644
--- a/astrid/plugin-src/com/todoroo/astrid/gcal/GCalControlSet.java
+++ b/astrid/plugin-src/com/todoroo/astrid/gcal/GCalControlSet.java
@@ -1,21 +1,26 @@
package com.todoroo.astrid.gcal;
-import java.util.Date;
-
import android.app.Activity;
+import android.content.ContentResolver;
import android.content.ContentValues;
+import android.content.Intent;
+import android.net.Uri;
+import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
-import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.Spinner;
+import android.widget.CompoundButton.OnCheckedChangeListener;
import com.flurry.android.FlurryAgent;
import com.timsu.astrid.R;
+import com.todoroo.andlib.service.Autowired;
+import com.todoroo.andlib.service.ExceptionService;
import com.todoroo.astrid.activity.TaskEditActivity.TaskEditControlSet;
import com.todoroo.astrid.gcal.Calendars.CalendarResult;
import com.todoroo.astrid.model.Task;
@@ -33,17 +38,19 @@ public class GCalControlSet implements TaskEditControlSet {
// --- instance variables
+ @Autowired
+ private ExceptionService exceptionService;
+
private final Activity activity;
- private final CalendarResult calendars;
+ private Uri calendarUri = null;
+ private final CalendarResult calendars;
private final CheckBox addToCalendar;
-
private final Spinner calendarSelector;
-
private final Button viewCalendarEvent;
- public GCalControlSet(Activity activity, ViewGroup parent) {
+ public GCalControlSet(final Activity activity, ViewGroup parent) {
this.activity = activity;
LayoutInflater.from(activity).inflate(R.layout.gcal_control, parent, true);
@@ -51,7 +58,7 @@ public class GCalControlSet implements TaskEditControlSet {
this.calendarSelector = (Spinner) activity.findViewById(R.id.calendars);
this.viewCalendarEvent = (Button) activity.findViewById(R.id.view_calendar_event);
- calendars = Calendars.getCalendars(activity);
+ calendars = Calendars.getCalendars();
ArrayAdapter adapter = new ArrayAdapter(activity,
android.R.layout.simple_spinner_item, calendars.calendars);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
@@ -64,92 +71,80 @@ public class GCalControlSet implements TaskEditControlSet {
}
});
- }
-
- /** Take the values from the model and set the calendar start and end times
- * based on these. Sets keys 'dtstart' and 'dtend'.
- *
- * @param preferred preferred due date or null
- * @param definite definite due date or null
- * @param estimatedSeconds estimated duration or null
- * @param values
- */
- @SuppressWarnings({ "nls", "unused" })
- public void createCalendarStartEndTimes(Date preferred, Date definite,
- Integer estimatedSeconds, ContentValues values) {
- FlurryAgent.onEvent("create-calendar-event");
-
- Long deadlineDate = null;
- if (preferred != null && preferred.after(new Date()))
- deadlineDate = preferred.getTime();
- else if (definite != null)
- deadlineDate = definite.getTime();
- else
- deadlineDate = System.currentTimeMillis() + 24*3600*1000L;
-
- int estimatedTime = DEFAULT_CAL_TIME;
- if(estimatedSeconds != null && estimatedSeconds > 0) {
- estimatedTime = estimatedSeconds;
- }
- values.put("dtstart", deadlineDate - estimatedTime * 1000L);
- values.put("dtend", deadlineDate);
- }
-
- @SuppressWarnings("unused")
- protected void onPause() {
- // create calendar event
- /*if(addToCalendar.isChecked() && model.getCalendarUri() == null) {
-
- Uri uri = Uri.parse("content://calendar/events");
- ContentResolver cr = getContentResolver();
-
- ContentValues values = new ContentValues();
- values.put("title", title.getText().toString());
- values.put("calendar_id", Preferences.getDefaultCalendarIDSafe(this));
- values.put("description", notes.getText().toString());
- values.put("hasAlarm", 0);
- values.put("transparency", 0);
- values.put("visibility", 0);
-
- createCalendarStartEndTimes(model.getPreferredDueDate(),
- model.getDefiniteDueDate(), model.getEstimatedSeconds(),
- values);
-
- Uri result = null;
- try{
- result = cr.insert(uri, values);
- model.setCalendarUri(result.toString());
- } catch (IllegalArgumentException e) {
- Log.e("astrid", "Error creating calendar event!", e);
+ viewCalendarEvent.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if(calendarUri == null)
+ return;
+ Intent intent = new Intent(Intent.ACTION_EDIT, calendarUri);
+ activity.startActivity(intent);
}
- } */
-
- // save save save
-
- /* if(addToCalendar.isChecked() && model.getCalendarUri() != null) {
- Uri result = Uri.parse(model.getCalendarUri());
- Intent intent = new Intent(Intent.ACTION_EDIT, result);
-
- ContentValues values = new ContentValues();
- createCalendarStartEndTimes(model.getPreferredDueDate(),
- model.getDefiniteDueDate(), model.getEstimatedSeconds(),
- values);
-
- intent.putExtra("beginTime", values.getAsLong("dtstart"));
- intent.putExtra("endTime", values.getAsLong("dtend"));
-
- startActivity(intent);
- } */
-
+ });
}
@Override
public void readFromTask(Task task) {
- //
+ String uri = task.getValue(Task.CALENDAR_URI);
+ if(!TextUtils.isEmpty(uri)) {
+ try {
+ calendarUri = Uri.parse(uri);
+ addToCalendar.setVisibility(View.GONE);
+ calendarSelector.setVisibility(View.GONE);
+ viewCalendarEvent.setVisibility(View.VISIBLE);
+ } catch (Exception e) {
+ exceptionService.reportError("unable-to-parse-calendar: " + //$NON-NLS-1$
+ task.getValue(Task.CALENDAR_URI), e);
+ }
+ }
}
+ @SuppressWarnings("nls")
@Override
public void writeToModel(Task task) {
- //
+ if(addToCalendar.isChecked() && calendarUri == null) {
+ FlurryAgent.onEvent("create-calendar-event");
+
+ try{
+ Uri uri = Calendars.getCalendarContentUri(Calendars.CALENDAR_CONTENT_EVENTS);
+ ContentResolver cr = activity.getContentResolver();
+
+ ContentValues values = new ContentValues();
+ values.put("title", task.getValue(Task.TITLE));
+ String calendarId = calendars.calendarIds[calendarSelector.getSelectedItemPosition()];
+ Calendars.setDefaultCalendar(calendarId);
+ values.put("calendar_id", calendarId);
+ values.put("description", task.getValue(Task.NOTES));
+ values.put("hasAlarm", 0);
+ values.put("transparency", 0);
+ values.put("visibility", 0);
+
+ long dueDate = task.getValue(Task.DUE_DATE);
+ if(task.hasDueDate()) {
+ if(task.hasDueTime()) {
+ int estimatedTime = task.getValue(Task.ESTIMATED_SECONDS);
+ if(estimatedTime <= 0)
+ estimatedTime = DEFAULT_CAL_TIME;
+ values.put("dtstart", dueDate - estimatedTime);
+ values.put("dtend", dueDate);
+ } else {
+ values.put("dtstart", dueDate);
+ values.put("dtend", dueDate);
+ values.put("allDay", "1");
+ }
+ }
+
+ calendarUri = cr.insert(uri, values);
+ task.setValue(Task.CALENDAR_URI, calendarUri.toString());
+
+ // pop up the new event
+ Intent intent = new Intent(Intent.ACTION_EDIT, calendarUri);
+ intent.putExtra("beginTime", values.getAsLong("dtstart"));
+ intent.putExtra("endTime", values.getAsLong("dtend"));
+ activity.startActivity(intent);
+ } catch (Exception e) {
+ exceptionService.displayAndReportError(activity,
+ activity.getString(R.string.gcal_TEA_error), e);
+ }
+ }
}
}
\ No newline at end of file
diff --git a/astrid/res/layout/gcal_control.xml b/astrid/res/layout/gcal_control.xml
index 274e672bd..edeb2a69c 100644
--- a/astrid/res/layout/gcal_control.xml
+++ b/astrid/res/layout/gcal_control.xml
@@ -11,14 +11,14 @@
+ android:text="@string/gcal_TEA_addToCalendar_label" />
diff --git a/astrid/res/values/strings-3.0.xml b/astrid/res/values/strings-3.0.xml
index 91de02d98..288cc1865 100644
--- a/astrid/res/values/strings-3.0.xml
+++ b/astrid/res/values/strings-3.0.xml
@@ -289,32 +289,6 @@ to the plugin creator for fastest service.
Time Already Spent on Task
-
- Calendar Integration:
-
-
- Create Calendar Event
-
-
- Open Calendar Event
-
-
- Repeat Every
-
-
- No Repeat Set
-
-
- Repeat Every (0 to disable)
- Help: Astrid Repeats
-
-To use repeats, set at least one of the deadlines above. When you complete this task, the deadline will be automatically advanced.
-\n\n
-If you don\'t want to see the new task right after you complete the old one, you should use the \"Hide Until\" field, which will also be advanced automatically.
-\n
-
- Don\'t Show Help Anymore
-
Save
diff --git a/astrid/res/values/strings-gcal.xml b/astrid/res/values/strings-gcal.xml
index faeea137c..539dc32bc 100644
--- a/astrid/res/values/strings-gcal.xml
+++ b/astrid/res/values/strings-gcal.xml
@@ -5,6 +5,19 @@
+
+
+ Error adding task to calendar!
+
+
+ Calendar Integration:
+
+
+ Create Calendar Event
+
+
+ Open Calendar Event
+
diff --git a/astrid/src/com/todoroo/astrid/utility/Preferences.java b/astrid/src/com/todoroo/astrid/utility/Preferences.java
index 1e5a4b936..1dd93c632 100644
--- a/astrid/src/com/todoroo/astrid/utility/Preferences.java
+++ b/astrid/src/com/todoroo/astrid/utility/Preferences.java
@@ -200,6 +200,16 @@ public class Preferences {
editor.commit();
}
+ /**
+ * Sets string preference
+ */
+ public static void setString(int keyResource, String newValue) {
+ Context context = ContextManager.getContext();
+ Editor editor = getPrefs(context).edit();
+ editor.putString(context.getString(keyResource), newValue);
+ editor.commit();
+ }
+
/**
* Sets string preference from integer value
*/