package com.plusonelabs.calendar.widget; import android.content.Context; import android.text.TextUtils; import android.text.format.DateFormat; import android.text.format.DateUtils; import com.plusonelabs.calendar.DateUtil; import com.plusonelabs.calendar.R; import com.plusonelabs.calendar.calendar.CalendarEvent; import com.plusonelabs.calendar.prefs.InstanceSettings; import org.joda.time.DateTime; public class CalendarEntry extends WidgetEntry { private static final String TWELVE = "12"; private static final String AUTO = "auto"; private static final String SPACE_ARROW = " →"; private static final String ARROW_SPACE = "→ "; private static final String EMPTY_STRING = ""; static final String SPACE_DASH_SPACE = " - "; private static final String SPACE_PIPE_SPACE = " | "; private DateTime endDate; private boolean allDay; private CalendarEvent event; public static CalendarEntry fromEvent(CalendarEvent event) { CalendarEntry entry = new CalendarEntry(); entry.setStartDate(event.getStartDate()); entry.endDate = event.getEndDate(); entry.allDay = event.isAllDay(); entry.event = event; return entry; } public String getTitle() { String title = event.getTitle(); if (TextUtils.isEmpty(title)) { title = getSettings().getEntryThemeContext().getResources().getString(R.string.no_title); } return title; } public DateTime getEndDate() { return endDate; } public void setEndDate(DateTime endDate) { this.endDate = endDate; } public int getColor() { return event.getColor(); } public boolean isAllDay() { return allDay; } public String getLocation() { return event.getLocation(); } public boolean isAlarmActive() { return event.isAlarmActive(); } public boolean isRecurring() { return event.isRecurring(); } public boolean isPartOfMultiDayEvent() { return getEvent().isPartOfMultiDayEvent(); } public boolean isStartOfMultiDayEvent() { return isPartOfMultiDayEvent() && !getEvent().getStartDate().isBefore(getStartDate()); } public boolean isEndOfMultiDayEvent() { return isPartOfMultiDayEvent() && !getEvent().getEndDate().isAfter(getEndDate()); } public boolean spansOneFullDay() { return getStartDate().plusDays(1).isEqual(getEndDate()); } public CalendarEvent getEvent() { return event; } public String getEventTimeString() { return hideEventDetails() ? "" : createTimeSpanString(getSettings().getEntryThemeContext()); } String getLocationString() { return getLocation() == null || getLocation().isEmpty() || hideEventDetails() || !getSettings().getShowLocation() ? "" : SPACE_PIPE_SPACE + getLocation(); } private boolean hideEventDetails() { return spansOneFullDay() && !(isStartOfMultiDayEvent() || isEndOfMultiDayEvent()) || isAllDay() && getSettings().getFillAllDayEvents(); } private String createTimeSpanString(Context context) { if (isAllDay() && !getSettings().getFillAllDayEvents()) { DateTime dateTime = getEvent().getEndDate().minusDays(1); return ARROW_SPACE + DateUtil.createDateString(getSettings(), dateTime); } else { return createTimeStringForCalendarEntry(context); } } private String createTimeStringForCalendarEntry(Context context) { String startStr; String endStr; String separator = SPACE_DASH_SPACE; if (isPartOfMultiDayEvent() && DateUtil.isMidnight(getStartDate()) && !isStartOfMultiDayEvent()) { startStr = ARROW_SPACE; separator = EMPTY_STRING; } else { startStr = createTimeString(context, getStartDate()); } if (getSettings().getShowEndTime()) { if (isPartOfMultiDayEvent() && DateUtil.isMidnight(getEndDate()) && !isEndOfMultiDayEvent()) { endStr = SPACE_ARROW; separator = EMPTY_STRING; } else { endStr = createTimeString(context, getEndDate()); } } else { separator = EMPTY_STRING; endStr = EMPTY_STRING; } if (startStr.equals(endStr)) { return startStr; } return startStr + separator + endStr; } private String createTimeString(Context context, DateTime time) { String dateFormat = getSettings().getDateFormat(); if (!DateFormat.is24HourFormat(context) && dateFormat.equals(AUTO) || dateFormat.equals(TWELVE)) { return DateUtil.formatDateTime(getSettings(), time, DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_12HOUR); } return DateUtil.formatDateTime(getSettings(), time, DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_24HOUR); } public InstanceSettings getSettings() { return event.getSettings(); } @Override public String toString() { return "CalendarEntry [" + "startDate=" + getStartDate() + (endDate != null ? ", endDate=" + getEndDate() : "") + ", allDay=" + allDay + ", event=" + event + "]"; } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } CalendarEntry that = (CalendarEntry) o; if (!event.equals(that.event) || !getStartDate().equals(that.getStartDate())) { return false; } return true; } @Override public int hashCode() { int result = super.hashCode(); result += 31 * event.hashCode(); return result; } }