public void setRangeDates(CalendarDay min, CalendarDay max) {
    this.minDate = min;
    this.maxDate = max;
    for (MonthView monthView : currentViews) {
      monthView.setMinimumDate(min);
      monthView.setMaximumDate(max);
    }

    if (min == null) {
      Calendar worker = CalendarUtils.getInstance();
      worker.add(Calendar.YEAR, -200);
      min = CalendarDay.from(worker);
    }

    if (max == null) {
      Calendar worker = CalendarUtils.getInstance();
      worker.add(Calendar.YEAR, 200);
      max = CalendarDay.from(worker);
    }

    rangeIndex = new DateRangeIndex(min, max);

    CalendarDay prevDate = selectedDate;
    notifyDataSetChanged();
    setSelectedDate(prevDate);
    if (prevDate != null) {
      if (!prevDate.equals(selectedDate)) {
        callbacks.onDateChanged(selectedDate);
      }
    }
  }
 public int getIndexForDay(CalendarDay day) {
   if (day == null) {
     return getCount() / 2;
   }
   if (minDate != null && day.isBefore(minDate)) {
     return 0;
   }
   if (maxDate != null && day.isAfter(maxDate)) {
     return getCount() - 1;
   }
   return rangeIndex.indexOf(day);
 }
 private CalendarDay getValidSelectedDate(CalendarDay date) {
   if (date == null) {
     return null;
   }
   if (minDate != null && minDate.isAfter(date)) {
     return minDate;
   }
   if (maxDate != null && maxDate.isBefore(date)) {
     return maxDate;
   }
   return date;
 }
 /** @param calendar set the maximum selectable date, null for no maximum */
 public void setMaximumDate(@Nullable Calendar calendar) {
   setMaximumDate(CalendarDay.from(calendar));
 }
 /** @param date set the maximum selectable date, null for no maximum */
 public void setMaximumDate(@Nullable Date date) {
   setMaximumDate(CalendarDay.from(date));
 }
 /** @param date a Date to focus the calendar on. Null will do nothing */
 public void setCurrentDate(@Nullable Date date) {
   setCurrentDate(CalendarDay.from(date));
 }
 /** @param calendar a Calendar set to a day to focus the calendar on. Null will do nothing */
 public void setCurrentDate(@Nullable Calendar calendar) {
   setCurrentDate(CalendarDay.from(calendar));
 }
 /** @param date a Date to set as selected. Null to clear selection */
 public void setSelectedDate(@Nullable Date date) {
   setSelectedDate(CalendarDay.from(date));
 }
 /** @param calendar a Calendar set to a day to select. Null to clear selection */
 public void setSelectedDate(@Nullable Calendar calendar) {
   setSelectedDate(CalendarDay.from(calendar));
 }
  public MaterialCalendarView(Context context, AttributeSet attrs) {
    super(context, attrs);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
      // If we're on good Android versions, turn off clipping for cool effects
      setClipToPadding(false);
      setClipChildren(false);
    } else {
      // Old Android does not like _not_ clipping view pagers, we need to clip
      setClipChildren(true);
      setClipToPadding(true);
    }

    buttonPast = new DirectionButton(getContext());
    title = new TextView(getContext());
    buttonFuture = new DirectionButton(getContext());
    pager = new ViewPager(getContext());

    setupChildren();

    title.setOnClickListener(onClickListener);
    buttonPast.setOnClickListener(onClickListener);
    buttonFuture.setOnClickListener(onClickListener);

    titleChanger = new TitleChanger(title);
    titleChanger.setTitleFormatter(DEFAULT_TITLE_FORMATTER);
    adapter = new MonthPagerAdapter();
    adapter.setTitleFormatter(DEFAULT_TITLE_FORMATTER);
    pager.setAdapter(adapter);
    pager.setOnPageChangeListener(pageChangeListener);
    pager.setPageTransformer(
        false,
        new ViewPager.PageTransformer() {
          @Override
          public void transformPage(View page, float position) {
            position = (float) Math.sqrt(1 - Math.abs(position));
            page.setAlpha(position);
          }
        });

    adapter.setCallbacks(monthViewCallbacks);

    TypedArray a =
        context.getTheme().obtainStyledAttributes(attrs, R.styleable.MaterialCalendarView, 0, 0);
    try {

      int tileSize = a.getDimensionPixelSize(R.styleable.MaterialCalendarView_mcv_tileSize, -1);
      if (tileSize > 0) {
        setTileSize(tileSize);
      }

      setArrowColor(a.getColor(R.styleable.MaterialCalendarView_mcv_arrowColor, Color.BLACK));
      Drawable leftMask = a.getDrawable(R.styleable.MaterialCalendarView_mcv_leftArrowMask);
      if (leftMask == null) {
        leftMask = getResources().getDrawable(R.drawable.mcv_action_previous);
      }
      setLeftArrowMask(leftMask);
      Drawable rightMask = a.getDrawable(R.styleable.MaterialCalendarView_mcv_rightArrowMask);
      if (rightMask == null) {
        rightMask = getResources().getDrawable(R.drawable.mcv_action_next);
      }
      setRightArrowMask(rightMask);

      setSelectionColor(
          a.getColor(
              R.styleable.MaterialCalendarView_mcv_selectionColor, getThemeAccentColor(context)));

      CharSequence[] array = a.getTextArray(R.styleable.MaterialCalendarView_mcv_weekDayLabels);
      if (array != null) {
        setWeekDayFormatter(new ArrayWeekDayFormatter(array));
      }

      array = a.getTextArray(R.styleable.MaterialCalendarView_mcv_monthLabels);
      if (array != null) {
        setTitleFormatter(new MonthArrayTitleFormatter(array));
      }

      setHeaderTextAppearance(
          a.getResourceId(
              R.styleable.MaterialCalendarView_mcv_headerTextAppearance,
              R.style.TextAppearance_MaterialCalendarWidget_Header));
      setWeekDayTextAppearance(
          a.getResourceId(
              R.styleable.MaterialCalendarView_mcv_weekDayTextAppearance,
              R.style.TextAppearance_MaterialCalendarWidget_WeekDay));
      setDateTextAppearance(
          a.getResourceId(
              R.styleable.MaterialCalendarView_mcv_dateTextAppearance,
              R.style.TextAppearance_MaterialCalendarWidget_Date));
      setShowOtherDates(a.getBoolean(R.styleable.MaterialCalendarView_mcv_showOtherDates, false));

      int firstDayOfWeek = a.getInt(R.styleable.MaterialCalendarView_mcv_firstDayOfWeek, -1);
      if (firstDayOfWeek < 0) {
        firstDayOfWeek = CalendarUtils.getInstance().getFirstDayOfWeek();
      }
      setFirstDayOfWeek(firstDayOfWeek);
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      a.recycle();
    }

    currentMonth = CalendarDay.today();
    setCurrentDate(currentMonth);

    if (isInEditMode()) {
      removeView(pager);
      MonthView monthView = new MonthView(context, currentMonth, getFirstDayOfWeek());
      monthView.setSelectionColor(getSelectionColor());
      monthView.setDateTextAppearance(adapter.getDateTextAppearance());
      monthView.setWeekDayTextAppearance(adapter.getWeekDayTextAppearance());
      monthView.setShowOtherDates(getShowOtherDates());
      addView(monthView, new LayoutParams(MonthView.DEFAULT_MONTH_TILE_HEIGHT));
    }
  }