diff options
Diffstat (limited to 'cgeo-calendar/src')
| -rw-r--r-- | cgeo-calendar/src/cgeo/calendar/AbstractAddEntry.java | 28 | ||||
| -rw-r--r-- | cgeo-calendar/src/cgeo/calendar/AddEntry.java | 54 | ||||
| -rw-r--r-- | cgeo-calendar/src/cgeo/calendar/AddEntryLevel14.java | 47 | ||||
| -rw-r--r-- | cgeo-calendar/src/cgeo/calendar/CalendarActivity.java | 219 | ||||
| -rw-r--r-- | cgeo-calendar/src/cgeo/calendar/CalendarEntry.java | 150 |
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; + } + +} |
