From efe3ccc58c80d189f8b17a3db6ff1a83e4fa0be4 Mon Sep 17 00:00:00 2001 From: Ilia Kurtov Date: Fri, 18 Mar 2016 18:48:26 +0300 Subject: [PATCH] added calendar date state --- .../components/calendar/CalendarAdapter.java | 18 +++-- .../calendar/CalendarDateState.java | 31 +++++++++ .../components/calendar/CalendarDayItem.java | 28 ++++++-- .../components/calendar/CalendarUtils.java | 65 +++++++++++++------ 4 files changed, 106 insertions(+), 36 deletions(-) create mode 100644 src/main/java/ru/touchin/roboswag/components/calendar/CalendarDateState.java diff --git a/src/main/java/ru/touchin/roboswag/components/calendar/CalendarAdapter.java b/src/main/java/ru/touchin/roboswag/components/calendar/CalendarAdapter.java index a465354..6918dbc 100644 --- a/src/main/java/ru/touchin/roboswag/components/calendar/CalendarAdapter.java +++ b/src/main/java/ru/touchin/roboswag/components/calendar/CalendarAdapter.java @@ -123,7 +123,8 @@ public abstract class CalendarAdapter= startSelectionPosition && position <= endSelectionPosition) { - bindDayItem(holder, currentDay, currentDate, State.SELECTED_MIDDLE); + bindDayItem(holder, currentDay, currentDate, State.SELECTED_MIDDLE, dateState); return; } - bindDayItem(holder, currentDay, currentDate, State.NOT_SELECTED); + bindDayItem(holder, currentDay, currentDate, State.NOT_SELECTED, dateState); } @Override @@ -197,8 +199,4 @@ public abstract class CalendarAdapter calendarItems = new ArrayList<>(); - final Calendar calendar = Calendar.getInstance(Locale.getDefault()); calendar.setTime(cleanStartDate.getTime()); - calendarItems.add(new CalendarHeaderItem(calendar.get(Calendar.MONTH), 0, 0)); - int shift = 1; + final List calendarItems = fillCalendarTillCurrentDate(cleanStartDate, calendar); - final int totalDaysCount = (int) ((cleanEndDate.getTimeInMillis() - cleanStartDate.getTimeInMillis()) / CalendarAdapter.ONE_DAY_LENGTH + 1); - long firstRangeDate = calendar.getTimeInMillis() / CalendarAdapter.ONE_DAY_LENGTH + 1; - int firstRange = calendar.get(Calendar.DAY_OF_MONTH) - 1; - int daysEnded = 0; + calendar.add(Calendar.DAY_OF_MONTH, 1); - shift += getFirstDateStart(cleanStartDate); - if (shift > 1) { - calendarItems.add(new CalendarEmptyItem(1, shift - 1)); - } + final int totalDaysCount = (int) ((cleanEndDate.getTimeInMillis() - calendar.getTimeInMillis()) / CalendarAdapter.ONE_DAY_LENGTH + 1); + int shift = calendarItems.get(calendarItems.size() - 1).getEndRange(); + int firstDate = calendar.get(Calendar.DAY_OF_MONTH) - 1; + int daysEnded = 1; while (true) { final int daysInCurrentMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); - if ((daysEnded + (daysInCurrentMonth - firstRange)) <= totalDaysCount) { + long firstRangeDate = calendar.getTimeInMillis() / CalendarAdapter.ONE_DAY_LENGTH + 1; + + if ((daysEnded + (daysInCurrentMonth - firstDate)) <= totalDaysCount) { calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.getActualMaximum(Calendar.DAY_OF_MONTH)); calendar.setTime(new Date(calendar.getTimeInMillis() + CalendarAdapter.ONE_DAY_LENGTH)); - calendarItems.add(new CalendarDayItem(firstRangeDate, firstRange + 1, - shift + daysEnded, shift + daysEnded + (daysInCurrentMonth - firstRange) - 1)); - daysEnded += daysInCurrentMonth - firstRange; + calendarItems.add(new CalendarDayItem(firstRangeDate, firstDate + 1, shift + daysEnded, + shift + daysEnded + (daysInCurrentMonth - firstDate) - 1, CalendarDateState.AFTER_TODAY)); + daysEnded += daysInCurrentMonth - firstDate; if (daysEnded == totalDaysCount) { break; } - firstRangeDate = calendar.getTimeInMillis() / CalendarAdapter.ONE_DAY_LENGTH + 1; - firstRange = 0; + firstDate = 0; final int firstDayInWeek = getFirstDateStart(calendar); @@ -174,7 +169,8 @@ public final class CalendarUtils { } } else { - calendarItems.add(new CalendarDayItem(firstRangeDate, firstRange + 1, shift + daysEnded, shift + totalDaysCount)); + calendarItems.add(new CalendarDayItem(firstRangeDate, firstDate + 1, shift + daysEnded, shift + totalDaysCount, + CalendarDateState.AFTER_TODAY)); break; } } @@ -182,6 +178,37 @@ public final class CalendarUtils { return calendarItems; } + private static List fillCalendarTillCurrentDate(final Calendar cleanStartDate, final Calendar calendar) { + final List calendarItems = new ArrayList<>(); + int shift = 0; + int firstDate = calendar.get(Calendar.DAY_OF_MONTH) - 1; + + // add first month header + calendarItems.add(new CalendarHeaderItem(calendar.get(Calendar.MONTH), 0, 0)); + calendar.set(Calendar.DAY_OF_MONTH, 1); + shift += 1; + + final int firstDayInTheWeek = getFirstDateStart(calendar); + + // check if first day is Monday. If not - add empty items. Otherwise do nothing + if (firstDayInTheWeek != 0) { + calendarItems.add(new CalendarEmptyItem(shift, shift + firstDayInTheWeek - 1)); + } + shift += firstDayInTheWeek; + + // add range with days before today + calendarItems.add(new CalendarDayItem(calendar.getTimeInMillis() / CalendarAdapter.ONE_DAY_LENGTH + 1, + 1, shift, shift + firstDate - 1, CalendarDateState.BEFORE_TODAY)); + shift += firstDate - 1; + + // add today item + calendar.setTime(cleanStartDate.getTime()); + calendarItems.add(new CalendarDayItem(calendar.getTimeInMillis() / CalendarAdapter.ONE_DAY_LENGTH + 1, + firstDate+1, shift + 1, shift + 1, CalendarDateState.TODAY)); + + return calendarItems; + } + private static int getFirstDateStart(@NonNull final Calendar calendar) { int firstDateStart = calendar.get(Calendar.DAY_OF_WEEK) - 2; if (firstDateStart == -1) {