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));
    }
  }