package com.prolificinteractive.materialcalendarview; import android.support.annotation.NonNull; import java.util.Calendar; import java.util.Date; import java.util.concurrent.TimeUnit; @Experimental public class WeekPagerAdapter extends CalendarPagerAdapter<WeekView> { public WeekPagerAdapter(MaterialCalendarView mcv) { super(mcv); } @Override protected WeekView createView(int position) { return new WeekView(mcv, getItem(position), mcv.getFirstDayOfWeek()); } @Override protected int indexOf(WeekView view) { CalendarDay week = view.getFirstViewDay(); return getRangeIndex().indexOf(week); } @Override protected boolean isInstanceOfView(Object object) { return object instanceof WeekView; } @Override protected DateRangeIndex createRangeIndex(CalendarDay min, CalendarDay max) { return new Weekly(min, max, mcv.getFirstDayOfWeek()); } public static class Weekly implements DateRangeIndex { private static final int DAYS_IN_WEEK = 7; private final CalendarDay min; private final int count; public Weekly(@NonNull CalendarDay min, @NonNull CalendarDay max, int firstDayOfWeek) { this.min = getFirstDayOfWeek(min, firstDayOfWeek); this.count = weekNumberDifference(this.min, max) + 1; } @Override public int getCount() { return count; } @Override public int indexOf(CalendarDay day) { return weekNumberDifference(min, day); } @Override public CalendarDay getItem(int position) { long minMillis = min.getDate().getTime(); long millisOffset = TimeUnit.MILLISECONDS.convert( position * DAYS_IN_WEEK, TimeUnit.DAYS); long positionMillis = minMillis + millisOffset; return CalendarDay.from(new Date(positionMillis)); } private int weekNumberDifference(@NonNull CalendarDay min, @NonNull CalendarDay max) { long millisDiff = max.getDate().getTime() - min.getDate().getTime(); int dstOffsetMax = max.getCalendar().get(Calendar.DST_OFFSET); int dstOffsetMin = min.getCalendar().get(Calendar.DST_OFFSET); long dayDiff = TimeUnit.DAYS.convert(millisDiff + dstOffsetMax - dstOffsetMin, TimeUnit.MILLISECONDS); return (int) (dayDiff / DAYS_IN_WEEK); } /* * Necessary because of how Calendar handles getting the first day of week internally. */ private CalendarDay getFirstDayOfWeek(@NonNull CalendarDay min, int wantedFirstDayOfWeek) { Calendar calendar = Calendar.getInstance(); min.copyTo(calendar); while (calendar.get(Calendar.DAY_OF_WEEK) != wantedFirstDayOfWeek) { calendar.add(Calendar.DAY_OF_WEEK, -1); } return CalendarDay.from(calendar); } } }