aboutsummaryrefslogtreecommitdiffstats
path: root/cgeo-calendar/src
diff options
context:
space:
mode:
authorBananeweizen <bananeweizen@gmx.de>2012-08-12 14:31:15 +0200
committerBananeweizen <bananeweizen@gmx.de>2012-08-12 14:31:15 +0200
commit48708e5195aa4d95b547a6104f903c97b0a0a9c6 (patch)
treeb56bb141e00500c783aca11503fb876229e33a4e /cgeo-calendar/src
parent1a68a9a5fd0d5456806a1fa1cb4a695b5326d019 (diff)
downloadcgeo-48708e5195aa4d95b547a6104f903c97b0a0a9c6.zip
cgeo-48708e5195aa4d95b547a6104f903c97b0a0a9c6.tar.gz
cgeo-48708e5195aa4d95b547a6104f903c97b0a0a9c6.tar.bz2
fix #1934: Calendar entry has wrong date
Diffstat (limited to 'cgeo-calendar/src')
-rw-r--r--cgeo-calendar/src/cgeo/calendar/AbstractAddEntry.java28
-rw-r--r--cgeo-calendar/src/cgeo/calendar/AddEntry.java54
-rw-r--r--cgeo-calendar/src/cgeo/calendar/AddEntryLevel14.java47
-rw-r--r--cgeo-calendar/src/cgeo/calendar/CalendarActivity.java219
-rw-r--r--cgeo-calendar/src/cgeo/calendar/CalendarEntry.java150
5 files changed, 296 insertions, 202 deletions
diff --git a/cgeo-calendar/src/cgeo/calendar/AbstractAddEntry.java b/cgeo-calendar/src/cgeo/calendar/AbstractAddEntry.java
new file mode 100644
index 0000000..99bd6d0
--- /dev/null
+++ b/cgeo-calendar/src/cgeo/calendar/AbstractAddEntry.java
@@ -0,0 +1,28 @@
+package cgeo.calendar;
+
+import android.util.Log;
+
+
+abstract class AbstractAddEntry {
+
+ protected CalendarEntry entry;
+ protected CalendarActivity activity;
+
+ public AbstractAddEntry(final CalendarEntry entry, CalendarActivity activity) {
+ this.entry = entry;
+ this.activity = activity;
+ }
+
+ void addEntryToCalendar() {
+ try {
+ addEntryToCalendarInternal();
+ } catch (Exception e) {
+ activity.showToast(R.string.event_fail);
+
+ Log.e(CalendarActivity.LOG_TAG, "addToCalendar: " + e.toString());
+ }
+ }
+
+ protected abstract void addEntryToCalendarInternal();
+
+}
diff --git a/cgeo-calendar/src/cgeo/calendar/AddEntry.java b/cgeo-calendar/src/cgeo/calendar/AddEntry.java
new file mode 100644
index 0000000..39092cb
--- /dev/null
+++ b/cgeo-calendar/src/cgeo/calendar/AddEntry.java
@@ -0,0 +1,54 @@
+package cgeo.calendar;
+
+import android.content.ContentValues;
+import android.net.Uri;
+import android.text.Html;
+
+import java.util.Date;
+
+class AddEntry extends AbstractAddEntry {
+
+ private int calendarId;
+
+ /**
+ * @param entry
+ * @param calendarId
+ * The selected calendar
+ */
+ public AddEntry(CalendarEntry entry, CalendarActivity activity, int calendarId) {
+ super(entry, activity);
+ this.calendarId = calendarId;
+ }
+
+ @Override
+ protected void addEntryToCalendarInternal() {
+ final Uri calendarProvider = Compatibility.getCalendarEventsProviderURI();
+
+ final Date eventDate = entry.parseDate();
+ final String description = entry.parseDescription();
+ final String eventLocation = entry.parseLocation();
+
+ // values
+ final ContentValues event = new ContentValues();
+ event.put("calendar_id", calendarId);
+ if (entry.getStartTimeMinutes() >= 0) {
+ event.put("dtstart", eventDate.getTime() + entry.getStartTimeMinutes() * 60000);
+ }
+ else {
+ event.put("dtstart", eventDate.getTime() + 43200000); // noon
+ event.put("dtend", eventDate.getTime() + 43200000 + 3600000); // + one hour
+ event.put("allDay", 1);
+ }
+ event.put("eventTimezone", "UTC");
+ event.put("title", Html.fromHtml(entry.getName()).toString());
+ event.put("description", description);
+
+ if (eventLocation.length() > 0) {
+ event.put("eventLocation", eventLocation);
+ }
+ event.put("hasAlarm", 0);
+
+ activity.getContentResolver().insert(calendarProvider, event);
+ }
+
+}
diff --git a/cgeo-calendar/src/cgeo/calendar/AddEntryLevel14.java b/cgeo-calendar/src/cgeo/calendar/AddEntryLevel14.java
new file mode 100644
index 0000000..787be73
--- /dev/null
+++ b/cgeo-calendar/src/cgeo/calendar/AddEntryLevel14.java
@@ -0,0 +1,47 @@
+package cgeo.calendar;
+
+import android.content.Intent;
+import android.text.Html;
+
+import java.util.Date;
+
+/**
+ * Add cache to calendar in Android versions 4.0 and greater using <code>Intent</code>. This does not require
+ * calendar permissions.
+ * TODO Does this work with apps other than default calendar app?
+ */
+class AddEntryLevel14 extends AbstractAddEntry {
+
+ public AddEntryLevel14(CalendarEntry entry, CalendarActivity activity) {
+ super(entry, activity);
+ }
+
+ @Override
+ protected void addEntryToCalendarInternal() {
+ final Date eventDate = entry.parseDate();
+ final String description = entry.parseDescription();
+ final String eventLocation = entry.parseLocation();
+
+ /*
+ * TODO These strings are available as constants starting with API 14 and can be used when
+ * targetSdkVersion changes to 14. For example CalendarContract.EXTRA_EVENT_BEGIN_TIME and
+ * Events.TITLE
+ */
+ final Intent intent = new Intent(Intent.ACTION_INSERT)
+ .setData(Compatibility.getCalendarEventsProviderURI())
+ .putExtra("title", Html.fromHtml(entry.getName()).toString())
+ .putExtra("description", description)
+ .putExtra("hasAlarm", false)
+ .putExtra("eventTimezone", "UTC")
+ .putExtra("eventLocation", eventLocation);
+ if (entry.getStartTimeMinutes() >= 0) {
+ intent.putExtra("beginTime", eventDate.getTime() + entry.getStartTimeMinutes() * 60000);
+ }
+ else {
+ intent.putExtra("beginTime", eventDate.getTime() + 43200000);
+ intent.putExtra("allDay", true);
+ }
+ activity.startActivity(intent);
+ }
+
+}
diff --git a/cgeo-calendar/src/cgeo/calendar/CalendarActivity.java b/cgeo-calendar/src/cgeo/calendar/CalendarActivity.java
index ed17d4c..b1c106d 100644
--- a/cgeo-calendar/src/cgeo/calendar/CalendarActivity.java
+++ b/cgeo-calendar/src/cgeo/calendar/CalendarActivity.java
@@ -2,35 +2,18 @@ package cgeo.calendar;
import android.app.Activity;
import android.app.AlertDialog;
-import android.content.ContentValues;
import android.content.DialogInterface;
-import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
-import android.text.Html;
-import android.text.Spanned;
-import android.text.style.ImageSpan;
import android.util.Log;
import android.util.SparseArray;
import android.view.Gravity;
import android.widget.Toast;
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
-import java.util.Date;
-
public final class CalendarActivity extends Activity {
- private static final String LOG_TAG = "cgeo.calendar";
- private String shortDesc;
- private String hiddenDate;
- private String url;
- private String personalNote;
- private String name;
- private String location;
- private String coords;
+ static final String LOG_TAG = "cgeo.calendar";
private Uri uri;
- private int startTimeMinutes = -1;
/** Called when the activity is first created. */
@Override
@@ -43,28 +26,15 @@ public final class CalendarActivity extends Activity {
finish();
return;
}
- shortDesc = getParameter(ICalendar.PARAM_SHORT_DESC);
- hiddenDate = getParameter(ICalendar.PARAM_HIDDEN_DATE);
- url = getParameter(ICalendar.PARAM_URL);
- personalNote = getParameter(ICalendar.PARAM_NOTE);
- name = getParameter(ICalendar.PARAM_NAME);
- location = getParameter(ICalendar.PARAM_LOCATION);
- coords = getParameter(ICalendar.PARAM_COORDS);
- final String startTime = getParameter(ICalendar.PARAM_START_TIME_MINUTES);
- if (startTime.length() > 0) {
- try {
- startTimeMinutes = Integer.valueOf(startTime);
- } catch (NumberFormatException e) {
- }
+ final CalendarEntry entry = new CalendarEntry(uri);
+ if (!entry.isValid()) {
+ return;
}
-
- if (name.length() > 0 && hiddenDate.length() > 0) {
- if (Compatibility.isLevel14()) {
- addToCalendarLevel14();
- finish();
- } else {
- selectCalendarForAdding();
- }
+ if (Compatibility.isLevel14()) {
+ new AddEntryLevel14(entry, this).addEntryToCalendar();
+ finish();
+ } else {
+ selectCalendarForAdding(entry);
}
} catch (Exception e) {
Log.e(LOG_TAG, e.getMessage(), e);
@@ -72,29 +42,19 @@ public final class CalendarActivity extends Activity {
}
}
- private String getParameter(final String paramKey) {
- try {
- final String param = uri.getQueryParameter(paramKey);
- if (param == null) {
- return "";
- }
- return URLDecoder.decode(param, "UTF-8").trim();
- } catch (UnsupportedEncodingException e) {
- }
- return "";
- }
-
/**
* Adds the cache to the Android-calendar if it is an event.
+ *
+ * @param entry
*/
- private void selectCalendarForAdding() {
+ private void selectCalendarForAdding(final CalendarEntry entry) {
final String[] projection = new String[] { "_id", "displayName" };
final Uri calendarProvider = Compatibility.getCalendarProviderURI();
final Cursor cursor = managedQuery(calendarProvider, projection, "selected=1", null, null);
if (cursor == null || cursor.getCount() <= 0) {
- showToast(getResources().getString(R.string.event_fail));
+ showToast(R.string.event_fail);
finish();
return;
}
@@ -122,7 +82,7 @@ public final class CalendarActivity extends Activity {
} while (cursor.moveToNext());
if (calendars.size() == 0) {
- showToast(getResources().getString(R.string.event_fail));
+ showToast(R.string.event_fail);
finish();
return;
}
@@ -138,7 +98,7 @@ public final class CalendarActivity extends Activity {
@Override
public void onClick(DialogInterface dialog, int item) {
final int calendarId = calendars.keyAt(item);
- addToCalendar(calendarId);
+ new AddEntry(entry, CalendarActivity.this, calendarId).addEntryToCalendar();
finish();
}
});
@@ -151,156 +111,11 @@ public final class CalendarActivity extends Activity {
builder.create().show();
}
- /**
- * @return <code>Date</code> based on hidden date. Time is set to 00:00:00.
- */
- private Date parseDate() {
- try {
- final Date eventDate = new Date(Long.parseLong(hiddenDate));
- eventDate.setHours(0);
- eventDate.setMinutes(0);
- eventDate.setSeconds(0);
-
- return eventDate;
- } catch (NumberFormatException e) {
- // cannot happen normally, but static code analysis does not know
- }
- return null;
- }
-
- /**
- * @return description string with images removed and personal note included
- */
- private String parseDescription() {
- final StringBuilder description = new StringBuilder();
- description.append(url);
- if (shortDesc.length() > 0) {
- // remove images in short description
- final Spanned spanned = Html.fromHtml(shortDesc, null, null);
- String text = spanned.toString();
- final ImageSpan[] spans = spanned.getSpans(0, spanned.length(), ImageSpan.class);
- for (int i = spans.length - 1; i >= 0; i--) {
- text = text.substring(0, spanned.getSpanStart(spans[i])) + text.substring(spanned.getSpanEnd(spans[i]));
- }
- if (text.length() > 0) {
- description.append("\n\n");
- description.append(text);
- }
- }
-
- if (personalNote.length() > 0) {
- description.append("\n\n").append(Html.fromHtml(personalNote).toString());
- }
-
- return description.toString();
- }
-
- /**
- * @return location string with coordinates and location
- */
- private String parseLocation() {
- final StringBuilder locBuffer = new StringBuilder();
- if (coords.length() > 0) {
- locBuffer.append(coords);
- }
- if (location.length() > 0) {
- boolean addParentheses = false;
- if (locBuffer.length() > 0) {
- addParentheses = true;
- locBuffer.append(" (");
- }
-
- locBuffer.append(Html.fromHtml(location).toString());
- if (addParentheses) {
- locBuffer.append(')');
- }
- }
-
- return locBuffer.toString();
- }
-
- /**
- * @param calendarId
- * The selected calendar
- */
- private void addToCalendar(int calendarId) {
- try {
- final Uri calendarProvider = Compatibility.getCalendarEventsProviderURI();
-
- final Date eventDate = parseDate();
- final String description = parseDescription();
- final String eventLocation = parseLocation();
-
- // values
- final ContentValues event = new ContentValues();
- event.put("calendar_id", calendarId);
- if (startTimeMinutes >= 0) {
- event.put("dtstart", eventDate.getTime() + startTimeMinutes * 60000);
- }
- else {
- event.put("allDay", 1);
- }
- event.put("eventTimezone", "UTC");
- event.put("title", Html.fromHtml(name).toString());
- event.put("description", description);
-
- if (eventLocation.length() > 0) {
- event.put("eventLocation", eventLocation);
- }
- event.put("hasAlarm", 0);
-
- getContentResolver().insert(calendarProvider, event);
-
- showToast(getResources().getString(R.string.event_success));
- } catch (Exception e) {
- showToast(getResources().getString(R.string.event_fail));
-
- Log.e(LOG_TAG, "CalendarActivity.addToCalendarFn", e);
- }
- }
-
- /**
- * Add cache to calendar in Android versions 4.0 and greater using <code>Intent</code>. This does not require
- * calendar permissions.
- * TODO Does this work with apps other than default calendar app?
- */
- private void addToCalendarLevel14() {
- try {
- final Date eventDate = parseDate();
- final String description = parseDescription();
- final String eventLocation = parseLocation();
-
- /*
- * TODO These strings are available as constants starting with API 14 and can be used when
- * targetSdkVersion changes to 14. For example CalendarContract.EXTRA_EVENT_BEGIN_TIME and
- * Events.TITLE
- */
- final Intent intent = new Intent(Intent.ACTION_INSERT)
- .setData(Compatibility.getCalendarEventsProviderURI())
- .putExtra("title", Html.fromHtml(name).toString())
- .putExtra("description", description)
- .putExtra("hasAlarm", false)
- .putExtra("eventTimezone", "UTC")
- .putExtra("eventLocation", eventLocation);
- if (startTimeMinutes >= 0) {
- intent.putExtra("beginTime", eventDate.getTime() + startTimeMinutes * 60000);
- }
- else {
- intent.putExtra("allDay", true);
- }
- startActivity(intent);
- } catch (Exception e) {
- showToast(getResources().getString(R.string.event_fail));
-
- Log.e(LOG_TAG, "CalendarActivity.addToCalendarLevel14: " + e.toString());
- }
- }
-
- public final void showToast(final String text) {
+ public final void showToast(final int res) {
+ final String text = getResources().getString(res);
final Toast toast = Toast.makeText(this, text, Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM, 0, 100);
toast.show();
}
-
} \ No newline at end of file
diff --git a/cgeo-calendar/src/cgeo/calendar/CalendarEntry.java b/cgeo-calendar/src/cgeo/calendar/CalendarEntry.java
new file mode 100644
index 0000000..6dddead
--- /dev/null
+++ b/cgeo-calendar/src/cgeo/calendar/CalendarEntry.java
@@ -0,0 +1,150 @@
+package cgeo.calendar;
+
+import android.net.Uri;
+import android.text.Html;
+import android.text.Spanned;
+import android.text.style.ImageSpan;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.util.Date;
+
+class CalendarEntry {
+
+ private String shortDesc;
+ private String hiddenDate;
+ private String url;
+ private String personalNote;
+ private String name;
+ private String location;
+ private String coords;
+ private int startTimeMinutes = -1;
+ private Uri uri;
+
+ public CalendarEntry(final Uri uri) {
+ this.uri = uri;
+ this.shortDesc = getParameter(ICalendar.PARAM_SHORT_DESC);
+ this.hiddenDate = getParameter(ICalendar.PARAM_HIDDEN_DATE);
+ this.url = getParameter(ICalendar.PARAM_URL);
+ this.personalNote = getParameter(ICalendar.PARAM_NOTE);
+ this.name = getParameter(ICalendar.PARAM_NAME);
+ location = getParameter(ICalendar.PARAM_LOCATION);
+ coords = getParameter(ICalendar.PARAM_COORDS);
+ final String startTime = getParameter(ICalendar.PARAM_START_TIME_MINUTES);
+ if (startTime.length() > 0) {
+ try {
+ this.startTimeMinutes = Integer.valueOf(startTime);
+ } catch (NumberFormatException e) {
+ }
+ }
+ }
+
+ private String getParameter(final String paramKey) {
+ try {
+ final String param = uri.getQueryParameter(paramKey);
+ if (param == null) {
+ return "";
+ }
+ return URLDecoder.decode(param, "UTF-8").trim();
+ } catch (UnsupportedEncodingException e) {
+ }
+ return "";
+ }
+
+ public boolean isValid() {
+ return (getName().length() > 0 && getHiddenDate().length() > 0);
+ }
+
+ public String getHiddenDate() {
+ return hiddenDate;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public String getPersonalNote() {
+ return personalNote;
+ }
+
+ public String getShortDesc() {
+ return shortDesc;
+ }
+
+ /**
+ * @return location string with coordinates and location
+ */
+ protected String parseLocation() {
+ final StringBuilder locBuffer = new StringBuilder();
+ if (coords.length() > 0) {
+ locBuffer.append(coords);
+ }
+ if (location.length() > 0) {
+ boolean addParentheses = false;
+ if (locBuffer.length() > 0) {
+ addParentheses = true;
+ locBuffer.append(" (");
+ }
+
+ locBuffer.append(Html.fromHtml(location).toString());
+ if (addParentheses) {
+ locBuffer.append(')');
+ }
+ }
+
+ return locBuffer.toString();
+ }
+
+ /**
+ * @return <code>Date</code> based on hidden date. Time is set to 00:00:00.
+ */
+ protected Date parseDate() {
+ try {
+ final Date eventDate = new Date(Long.parseLong(getHiddenDate()));
+ eventDate.setHours(0);
+ eventDate.setMinutes(0);
+ eventDate.setSeconds(0);
+
+ return eventDate;
+ } catch (NumberFormatException e) {
+ // cannot happen normally, but static code analysis does not know
+ }
+ return null;
+ }
+
+ /**
+ * @return description string with images removed and personal note included
+ */
+ protected String parseDescription() {
+ final StringBuilder description = new StringBuilder();
+ description.append(getUrl());
+ if (getShortDesc().length() > 0) {
+ // remove images in short description
+ final Spanned spanned = Html.fromHtml(getShortDesc(), null, null);
+ String text = spanned.toString();
+ final ImageSpan[] spans = spanned.getSpans(0, spanned.length(), ImageSpan.class);
+ for (int i = spans.length - 1; i >= 0; i--) {
+ text = text.substring(0, spanned.getSpanStart(spans[i])) + text.substring(spanned.getSpanEnd(spans[i]));
+ }
+ if (text.length() > 0) {
+ description.append("\n\n");
+ description.append(text);
+ }
+ }
+
+ if (getPersonalNote().length() > 0) {
+ description.append("\n\n").append(Html.fromHtml(getPersonalNote()).toString());
+ }
+
+ return description.toString();
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public int getStartTimeMinutes() {
+ return startTimeMinutes;
+ }
+
+}