package org.smartpaws.util; import org.smartpaws.R; import org.smartpaws.objects.Event; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Locale; import java.util.TimeZone; import static org.smartpaws.MainActivity.INSTANCE; public final class TimeUtils { private static final int SECOND = 1; private static final int MINUTE = 60 * SECOND; private static final int HOUR = 60 * MINUTE; private static final int DAY = 24 * HOUR; private static final int MONTH = 30 * DAY; private static final SimpleDateFormat startFormat = new SimpleDateFormat("EEE HH:mm", Locale.getDefault()); private static final SimpleDateFormat endFormat = new SimpleDateFormat("HH:mm", Locale.getDefault()); static { startFormat.setTimeZone(TimeZone.getDefault()); endFormat.setTimeZone(TimeZone.getDefault()); } public static String getDayOfMonthSuffix(final int n) { if (n < 1 || n > 31) return ""; if (n >= 11 && n <= 13) { return "th"; } switch (n % 10) { case 1: return "st"; case 2: return "nd"; case 3: return "rd"; default: return "th"; } } public static String toFuzzyTime(Date date) { TimeSpan ts = new TimeSpan(System.currentTimeMillis() - date.getTime()); double delta = Math.abs(ts.getSeconds()); if (delta < 0) { return "Ergh, I don't know when."; } if (delta < 1 * MINUTE) { return ts.getSeconds() == 1 ? "a second ago" : ts.getSeconds() + " seconds ago"; } if (delta < 2 * MINUTE) { return "a minute ago"; } if (delta < 45 * MINUTE) { return ts.getMinutes() + " minutes ago"; } if (delta < 90 * MINUTE) { return "an hour ago"; } if (delta < 24 * HOUR) { return ts.getHours() + " hours ago"; } if (delta < 48 * HOUR) { return "yesterday"; } if (delta < 30 * DAY) { return ts.getDays() + " days ago"; } if (delta < 12 * MONTH) { int months = (int) Math.floor((double)ts.getDays() / 30); return months <= 1 ? "a month ago" : months + " months ago"; } else { int years = (int) Math.floor((double)ts.getDays() / 365); return years <= 1 ? "one year ago" : years + " years ago"; } } public static Date getEndDate(Event event) { Calendar cal = Calendar.getInstance(); cal.setTime(event.getDateStart()); cal.add(Calendar.MINUTE, event.getDuration()); return cal.getTime(); } public static boolean hasStarted(Event event) { return event.getDateStart().compareTo(new Date(System.currentTimeMillis())) < 0; } public static boolean isPast(Event event) { return getEndDate(event).compareTo(new Date(System.currentTimeMillis())) < 0; } public static boolean isRunning(Event event) { return hasStarted(event) && !isPast(event); } private static class TimeSpan { private final long span; public TimeSpan(long spanMillis) { this.span = spanMillis; } public long getSeconds() { return Math.round(span / 1000); } public long getMinutes() { return Math.round((span / 1000) / 60); } public int getHours() { return Math.round(((span / 1000) / 60) / 60); } public int getDays() { return Math.round((((span / 1000) / 60) / 60) / 24); } } public static String formatEventTime(Date date, int duration) { StringBuilder result = new StringBuilder(startFormat.format(date)); Calendar cal = Calendar.getInstance(); cal.setTime(date); cal.add(Calendar.MINUTE, duration); result.append(" - "); result.append(endFormat.format(cal.getTime())); return result.toString(); } public static String getTimeTill(String eventName, Date date) { int secondsTill = Math.round((date.getTime() - System.currentTimeMillis()) / 1000); if (secondsTill < 0) return "the distant past"; if (secondsTill < 60) { if (secondsTill == 1) { return INSTANCE.getString(R.string.notif_event_start_sec, eventName); } return INSTANCE.getString(R.string.notif_event_start_secs, eventName, secondsTill); } if (secondsTill >= 60) { int minsTill = Math.round(secondsTill / 60); if (minsTill == 1) return INSTANCE.getString(R.string.notif_event_start_min, eventName); if (minsTill >= 60) { long hoursTill = Math.round(minsTill / 60); if (hoursTill == 1) return INSTANCE.getString(R.string.notif_event_start_hour, eventName); return INSTANCE.getString(R.string.notif_event_start_hours, eventName, hoursTill); } return INSTANCE.getString(R.string.notif_event_start_mins, eventName, minsTill); } return INSTANCE.getString(R.string.notif_event_start_soon, eventName); } }