aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cgeo-calendar/src/cgeo/calendar/CalendarActivity.java42
-rw-r--r--main/res/values-de/strings.xml3
-rw-r--r--main/res/values/strings.xml3
-rw-r--r--main/src/cgeo/calendar/ICalendar.java1
-rw-r--r--main/src/cgeo/geocaching/CacheDetailActivity.java3
-rw-r--r--main/src/cgeo/geocaching/cgCache.java43
6 files changed, 80 insertions, 15 deletions
diff --git a/cgeo-calendar/src/cgeo/calendar/CalendarActivity.java b/cgeo-calendar/src/cgeo/calendar/CalendarActivity.java
index 1bcb16e..ed17d4c 100644
--- a/cgeo-calendar/src/cgeo/calendar/CalendarActivity.java
+++ b/cgeo-calendar/src/cgeo/calendar/CalendarActivity.java
@@ -30,6 +30,7 @@ public final class CalendarActivity extends Activity {
private String location;
private String coords;
private Uri uri;
+ private int startTimeMinutes = -1;
/** Called when the activity is first created. */
@Override
@@ -49,6 +50,13 @@ public final class CalendarActivity extends Activity {
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) {
+ }
+ }
if (name.length() > 0 && hiddenDate.length() > 0) {
if (Compatibility.isLevel14()) {
@@ -147,12 +155,17 @@ public final class CalendarActivity extends Activity {
* @return <code>Date</code> based on hidden date. Time is set to 00:00:00.
*/
private Date parseDate() {
- final Date eventDate = new Date(Long.parseLong(hiddenDate));
- eventDate.setHours(0);
- eventDate.setMinutes(0);
- eventDate.setSeconds(0);
-
- return eventDate;
+ 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;
}
/**
@@ -221,8 +234,12 @@ public final class CalendarActivity extends Activity {
// values
final ContentValues event = new ContentValues();
event.put("calendar_id", calendarId);
- event.put("dtstart", eventDate.getTime() + 43200000); // noon
- event.put("dtend", eventDate.getTime() + 43200000 + 3600000); // + one hour
+ 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);
@@ -230,7 +247,6 @@ public final class CalendarActivity extends Activity {
if (eventLocation.length() > 0) {
event.put("eventLocation", eventLocation);
}
- event.put("allDay", 1);
event.put("hasAlarm", 0);
getContentResolver().insert(calendarProvider, event);
@@ -261,13 +277,17 @@ public final class CalendarActivity extends Activity {
*/
final Intent intent = new Intent(Intent.ACTION_INSERT)
.setData(Compatibility.getCalendarEventsProviderURI())
- .putExtra("beginTime", eventDate.getTime() + 43200000)
- .putExtra("allDay", true)
.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));
diff --git a/main/res/values-de/strings.xml b/main/res/values-de/strings.xml
index e1a96fd..f811f44 100644
--- a/main/res/values-de/strings.xml
+++ b/main/res/values-de/strings.xml
@@ -598,7 +598,8 @@
<string name="cache_image_open_file">Als Datei öffnen</string>
<string name="cache_image_open_browser">Im Browser öffnen</string>
<string name="cache_share_field">Weiterleiten</string>
-
+ <string name="cache_time_full_hours">Uhr</string>
+
<!-- file list base -->
<string name="file_searching_in">Suche nach Dateien\nin</string>
<string name="file_searching_sdcard_in">Keine Dateien in Standardverzeichnissen gefunden:\n%1$s\n\nDurchsuche komplette SD-Karte:\n</string>
diff --git a/main/res/values/strings.xml b/main/res/values/strings.xml
index 2d9d50b..6735730 100644
--- a/main/res/values/strings.xml
+++ b/main/res/values/strings.xml
@@ -608,7 +608,8 @@
<string name="cache_image_open_file">Open as file</string>
<string name="cache_image_open_browser">Open in browser</string>
<string name="cache_share_field">Share</string>
-
+ <string name="cache_time_full_hours">o\'clock</string>
+
<!-- file list base -->
<string name="file_searching_in">Searching for files\nin</string>
<string name="file_searching_sdcard_in">No files found in default folders:\n%1$s\n\nSearching whole SD card for files:\n</string>
diff --git a/main/src/cgeo/calendar/ICalendar.java b/main/src/cgeo/calendar/ICalendar.java
index 856de1a..933d248 100644
--- a/main/src/cgeo/calendar/ICalendar.java
+++ b/main/src/cgeo/calendar/ICalendar.java
@@ -15,4 +15,5 @@ public interface ICalendar {
static final String PARAM_NAME = "name"; // cache name
static final String PARAM_LOCATION = "location"; // cache location, or empty string
static final String PARAM_COORDS = "coords"; // cache coords, or empty string
+ static final String PARAM_START_TIME_MINUTES = "time"; // time of start
}
diff --git a/main/src/cgeo/geocaching/CacheDetailActivity.java b/main/src/cgeo/geocaching/CacheDetailActivity.java
index d1b0fde..93566c2 100644
--- a/main/src/cgeo/geocaching/CacheDetailActivity.java
+++ b/main/src/cgeo/geocaching/CacheDetailActivity.java
@@ -787,7 +787,8 @@ public class CacheDetailActivity extends AbstractActivity {
ICalendar.PARAM_URL, StringUtils.defaultString(cache.getUrl()),
ICalendar.PARAM_COORDS, cache.getCoords() == null ? "" : cache.getCoords().format(GeopointFormatter.Format.LAT_LON_DECMINUTE_RAW),
ICalendar.PARAM_LOCATION, StringUtils.defaultString(cache.getLocation()),
- ICalendar.PARAM_SHORT_DESC, StringUtils.defaultString(cache.getShortDescription())
+ ICalendar.PARAM_SHORT_DESC, StringUtils.defaultString(cache.getShortDescription()),
+ ICalendar.PARAM_START_TIME_MINUTES, StringUtils.defaultString(cache.guessEventTimeMinutes())
);
startActivity(new Intent(ICalendar.INTENT,
diff --git a/main/src/cgeo/geocaching/cgCache.java b/main/src/cgeo/geocaching/cgCache.java
index b889d3e..b8590e5 100644
--- a/main/src/cgeo/geocaching/cgCache.java
+++ b/main/src/cgeo/geocaching/cgCache.java
@@ -1550,4 +1550,45 @@ public class cgCache implements ICache, IWaypoint {
return listId >= StoredList.STANDARD_LIST_ID;
}
-}
+ /**
+ * guess an event start time from the description
+ *
+ * @return start time in minutes after midnight
+ */
+ public String guessEventTimeMinutes() {
+ if (!isEventCache()) {
+ return null;
+ }
+ // 12:34
+ final Pattern time = Pattern.compile("\\b(\\d{1,2})\\:(\\d\\d)\\b");
+ final Matcher matcher = time.matcher(getDescription());
+ while (matcher.find()) {
+ try {
+ final int hours = Integer.valueOf(matcher.group(1));
+ final int minutes = Integer.valueOf(matcher.group(2));
+ if (hours >= 0 && hours < 24 && minutes >= 0 && minutes < 60) {
+ return String.valueOf(hours * 60 + minutes);
+ }
+ } catch (NumberFormatException e) {
+ // cannot happen, but static code analysis doesn't know
+ }
+ }
+ // 12 o'clock
+ final String hourLocalized = cgeoapplication.getInstance().getString(R.string.cache_time_full_hours);
+ if (StringUtils.isNotBlank(hourLocalized)) {
+ final Pattern fullHours = Pattern.compile("\\b(\\d{1,2})\\s+" + Pattern.quote(hourLocalized), Pattern.CASE_INSENSITIVE);
+ final Matcher matcherHours = fullHours.matcher(getDescription());
+ if (matcherHours.find()) {
+ try {
+ final int hours = Integer.valueOf(matcherHours.group(1));
+ if (hours >= 0 && hours < 24) {
+ return String.valueOf(hours * 60);
+ }
+ } catch (NumberFormatException e) {
+ // cannot happen, but static code analysis doesn't know
+ }
+ }
+ }
+ return null;
+ }
+} \ No newline at end of file