package com.prolificinteractive.materialcalendarview; import android.os.Parcel; import android.os.Parcelable; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import java.util.Calendar; import java.util.Date; /** * An imputable representation of a day on a calendar */ public final class CalendarDay implements Parcelable { /** * Get a new instance set to today * * @return CalendarDay set to today's date */ @NonNull public static CalendarDay today() { return from(CalendarUtils.getInstance()); } /** * Get a new instance set to the specified day * * @param year new instance's year * @param month new instance's month as defined by {@linkplain java.util.Calendar} * @param day new instance's day of month * @return CalendarDay set to the specified date */ @NonNull public static CalendarDay from(int year, int month, int day) { return new CalendarDay(year, month, day); } /** * Get a new instance set to the specified day * * @param calendar {@linkplain Calendar} to pull date information from. Passing null will return null * @return CalendarDay set to the specified date */ public static CalendarDay from(@Nullable Calendar calendar) { if (calendar == null) { return null; } return from( CalendarUtils.getYear(calendar), CalendarUtils.getMonth(calendar), CalendarUtils.getDay(calendar) ); } /** * Get a new instance set to the specified day * * @param date {@linkplain Date} to pull date information from. Passing null will return null. * @return CalendarDay set to the specified date */ public static CalendarDay from(@Nullable Date date) { if (date == null) { return null; } return from(CalendarUtils.getInstance(date)); } private final int year; private final int month; private final int day; /** * Cache for calls to {@linkplain #getCalendar()} */ private transient Calendar _calendar; /** * Cache for calls to {@linkplain #getDate()} */ private transient Date _date; /** * Initialized to the current day * * @see CalendarDay#today() */ @Deprecated public CalendarDay() { this(CalendarUtils.getInstance()); } /** * @param calendar source to pull date information from for this instance * @see CalendarDay#from(Calendar) */ @Deprecated public CalendarDay(Calendar calendar) { this( CalendarUtils.getYear(calendar), CalendarUtils.getMonth(calendar), CalendarUtils.getDay(calendar) ); } /** * @param year new instance's year * @param month new instance's month as defined by {@linkplain java.util.Calendar} * @param day new instance's day of month * @see CalendarDay#from(Calendar) */ @Deprecated public CalendarDay(int year, int month, int day) { this.year = year; this.month = month; this.day = day; } /** * @param date source to pull date information from for this instance * @see CalendarDay#from(Date) */ @Deprecated public CalendarDay(Date date) { this(CalendarUtils.getInstance(date)); } /** * Get the year * * @return the year for this day */ public int getYear() { return year; } /** * Get the month, represented by values from {@linkplain Calendar} * * @return the month of the year as defined by {@linkplain Calendar} */ public int getMonth() { return month; } /** * Get the day * * @return the day of the month for this day */ public int getDay() { return day; } /** * Get this day as a {@linkplain Date} * * @return a date with this days information */ @NonNull public Date getDate() { if (_date == null) { _date = getCalendar().getTime(); } return _date; } /** * Get this day as a {@linkplain Calendar} * * @return a new calendar instance with this day information */ @NonNull public Calendar getCalendar() { if (_calendar == null) { _calendar = CalendarUtils.getInstance(); copyTo(_calendar); } return _calendar; } void copyToMonthOnly(@NonNull Calendar calendar) { calendar.clear(); calendar.set(year, month, 1); } /** * Copy this day's information to the given calendar instance * * @param calendar calendar to set date information to */ public void copyTo(@NonNull Calendar calendar) { calendar.clear(); calendar.set(year, month, day); } /** * Determine if this day is within a specified range * * @param minDate the earliest day, may be null * @param maxDate the latest day, may be null * @return true if the between (inclusive) the min and max dates. */ public boolean isInRange(@Nullable CalendarDay minDate, @Nullable CalendarDay maxDate) { return !(minDate != null && minDate.isAfter(this)) && !(maxDate != null && maxDate.isBefore(this)); } /** * Determine if this day is before the given instance * * @param other the other day to test * @return true if this is before other, false if equal or after */ public boolean isBefore(@NonNull CalendarDay other) { if (other == null) { throw new IllegalArgumentException("other cannot be null"); } if (year == other.year) { return ((month == other.month) ? (day < other.day) : (month < other.month)); } else { return year < other.year; } } /** * Determine if this day is after the given instance * * @param other the other day to test * @return true if this is after other, false if equal or before */ public boolean isAfter(@NonNull CalendarDay other) { if (other == null) { throw new IllegalArgumentException("other cannot be null"); } if (year == other.year) { return (month == other.month) ? (day > other.day) : (month > other.month); } else { return year > other.year; } } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } CalendarDay that = (CalendarDay) o; return day == that.day && month == that.month && year == that.year; } @Override public int hashCode() { return hashCode(year, month, day); } private static int hashCode(int year, int month, int day) { //Should produce hashes like "20150401" return (year * 10000) + (month * 100) + day; } @Override public String toString() { return "CalendarDay{" + year + "-" + month + "-" + day + "}"; } /* * Parcelable Stuff */ public CalendarDay(Parcel in) { this(in.readInt(), in.readInt(), in.readInt()); } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(year); dest.writeInt(month); dest.writeInt(day); } public static final Creator<CalendarDay> CREATOR = new Creator<CalendarDay>() { public CalendarDay createFromParcel(Parcel in) { return new CalendarDay(in); } public CalendarDay[] newArray(int size) { return new CalendarDay[size]; } }; }