@Override
  public View onCreateView(
      LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    mRecurrence.wkst = EventRecurrence.timeDay2Day(Utils.getFirstDayOfWeek(getActivity()));

    getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);

    boolean endCountHasFocus = false;
    if (savedInstanceState != null) {
      RecurrenceModel m = (RecurrenceModel) savedInstanceState.get(BUNDLE_MODEL);
      if (m != null) {
        mModel = m;
      }
      endCountHasFocus = savedInstanceState.getBoolean(BUNDLE_END_COUNT_HAS_FOCUS);
    } else {
      Bundle bundle = getArguments();
      if (bundle != null) {
        mTime.set(bundle.getLong(BUNDLE_START_TIME_MILLIS));

        String tz = bundle.getString(BUNDLE_TIME_ZONE);
        if (!TextUtils.isEmpty(tz)) {
          mTime.timezone = tz;
        }
        mTime.normalize(false);

        // Time days of week: Sun=0, Mon=1, etc
        mModel.weeklyByDayOfWeek[mTime.weekDay] = true;
        String rrule = bundle.getString(BUNDLE_RRULE);
        if (!TextUtils.isEmpty(rrule)) {
          mModel.recurrenceState = RecurrenceModel.STATE_RECURRENCE;
          mRecurrence.parse(rrule);
          copyEventRecurrenceToModel(mRecurrence, mModel);
          // Leave today's day of week as checked by default in weekly view.
          if (mRecurrence.bydayCount == 0) {
            mModel.weeklyByDayOfWeek[mTime.weekDay] = true;
          }
        }

        mModel.forceHideSwitchButton = bundle.getBoolean(BUNDLE_HIDE_SWITCH_BUTTON, false);
      } else {
        mTime.setToNow();
      }
    }

    mResources = getResources();
    mView = inflater.inflate(R.layout.recurrencepicker, container, true);

    final Activity activity = getActivity();
    final Configuration config = activity.getResources().getConfiguration();

    mRepeatSwitch = (SwitchCompat) mView.findViewById(R.id.repeat_switch);
    if (mModel.forceHideSwitchButton) {
      mRepeatSwitch.setChecked(true);
      mRepeatSwitch.setVisibility(View.GONE);
      mModel.recurrenceState = RecurrenceModel.STATE_RECURRENCE;
    } else {
      mRepeatSwitch.setChecked(mModel.recurrenceState == RecurrenceModel.STATE_RECURRENCE);
      mRepeatSwitch.setOnCheckedChangeListener(
          new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
              mModel.recurrenceState =
                  isChecked
                      ? RecurrenceModel.STATE_RECURRENCE
                      : RecurrenceModel.STATE_NO_RECURRENCE;
              togglePickerOptions();
            }
          });
    }
    mFreqSpinner = (Spinner) mView.findViewById(R.id.freqSpinner);
    mFreqSpinner.setOnItemSelectedListener(this);
    ArrayAdapter<CharSequence> freqAdapter =
        ArrayAdapter.createFromResource(
            getActivity(), R.array.recurrence_freq, R.layout.recurrencepicker_freq_item);
    freqAdapter.setDropDownViewResource(R.layout.recurrencepicker_freq_item);
    mFreqSpinner.setAdapter(freqAdapter);

    mInterval = (EditText) mView.findViewById(R.id.interval);
    mInterval.addTextChangedListener(
        new minMaxTextWatcher(1, INTERVAL_DEFAULT, INTERVAL_MAX) {
          @Override
          void onChange(int v) {
            if (mIntervalResId != -1 && mInterval.getText().toString().length() > 0) {
              mModel.interval = v;
              updateIntervalText();
              mInterval.requestLayout();
            }
          }
        });
    mIntervalPreText = (TextView) mView.findViewById(R.id.intervalPreText);
    mIntervalPostText = (TextView) mView.findViewById(R.id.intervalPostText);

    mEndNeverStr = mResources.getString(R.string.recurrence_end_continously);
    mEndDateLabel = mResources.getString(R.string.recurrence_end_date_label);
    mEndCountLabel = mResources.getString(R.string.recurrence_end_count_label);

    mEndSpinnerArray.add(mEndNeverStr);
    mEndSpinnerArray.add(mEndDateLabel);
    mEndSpinnerArray.add(mEndCountLabel);
    mEndSpinner = (Spinner) mView.findViewById(R.id.endSpinner);
    mEndSpinner.setOnItemSelectedListener(this);
    mEndSpinnerAdapter =
        new EndSpinnerAdapter(
            getActivity(),
            mEndSpinnerArray,
            R.layout.recurrencepicker_freq_item,
            R.layout.recurrencepicker_end_text);
    mEndSpinnerAdapter.setDropDownViewResource(R.layout.recurrencepicker_freq_item);
    mEndSpinner.setAdapter(mEndSpinnerAdapter);

    mEndCount = (EditText) mView.findViewById(R.id.endCount);
    mEndCount.addTextChangedListener(
        new minMaxTextWatcher(1, COUNT_DEFAULT, COUNT_MAX) {
          @Override
          void onChange(int v) {
            if (mModel.endCount != v) {
              mModel.endCount = v;
              updateEndCountText();
              mEndCount.requestLayout();
            }
          }
        });
    mPostEndCount = (TextView) mView.findViewById(R.id.postEndCount);

    mEndDateTextView = (TextView) mView.findViewById(R.id.endDate);
    mEndDateTextView.setOnClickListener(this);
    if (mModel.endDate == null) {
      mModel.endDate = new Time(mTime);
      switch (mModel.freq) {
        case RecurrenceModel.FREQ_HOURLY:
        case RecurrenceModel.FREQ_DAILY:
        case RecurrenceModel.FREQ_WEEKLY:
          mModel.endDate.month += 1;
          break;
        case RecurrenceModel.FREQ_MONTHLY:
          mModel.endDate.month += 3;
          break;
        case RecurrenceModel.FREQ_YEARLY:
          mModel.endDate.year += 3;
          break;
      }
      mModel.endDate.normalize(false);
    }

    mWeekGroup = (LinearLayout) mView.findViewById(R.id.weekGroup);
    mWeekGroup2 = (LinearLayout) mView.findViewById(R.id.weekGroup2);

    // In Calendar.java day of week order e.g Sun = 1 ... Sat = 7
    String[] dayOfWeekString = new DateFormatSymbols().getWeekdays();

    mMonthRepeatByDayOfWeekStrs = new String[7][];
    // from Time.SUNDAY as 0 through Time.SATURDAY as 6
    mMonthRepeatByDayOfWeekStrs[0] = mResources.getStringArray(R.array.repeat_by_nth_sun);
    mMonthRepeatByDayOfWeekStrs[1] = mResources.getStringArray(R.array.repeat_by_nth_mon);
    mMonthRepeatByDayOfWeekStrs[2] = mResources.getStringArray(R.array.repeat_by_nth_tues);
    mMonthRepeatByDayOfWeekStrs[3] = mResources.getStringArray(R.array.repeat_by_nth_wed);
    mMonthRepeatByDayOfWeekStrs[4] = mResources.getStringArray(R.array.repeat_by_nth_thurs);
    mMonthRepeatByDayOfWeekStrs[5] = mResources.getStringArray(R.array.repeat_by_nth_fri);
    mMonthRepeatByDayOfWeekStrs[6] = mResources.getStringArray(R.array.repeat_by_nth_sat);

    // In Time.java day of week order e.g. Sun = 0
    int idx = Utils.getFirstDayOfWeek(getActivity());

    // In Calendar.java day of week order e.g Sun = 1 ... Sat = 7
    dayOfWeekString = new DateFormatSymbols().getShortWeekdays();

    int numOfButtonsInRow1;
    int numOfButtonsInRow2;

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR2) {
      // Get screen width in dp first
      Display display = getActivity().getWindowManager().getDefaultDisplay();
      DisplayMetrics outMetrics = new DisplayMetrics();
      display.getMetrics(outMetrics);

      float density = getResources().getDisplayMetrics().density;
      float dpWidth = outMetrics.widthPixels / density;
      if (dpWidth > MIN_SCREEN_WIDTH_FOR_SINGLE_ROW_WEEK) {
        numOfButtonsInRow1 = 7;
        numOfButtonsInRow2 = 0;
        mWeekGroup2.setVisibility(View.GONE);
        mWeekGroup2.getChildAt(3).setVisibility(View.GONE);
      } else {
        numOfButtonsInRow1 = 4;
        numOfButtonsInRow2 = 3;

        mWeekGroup2.setVisibility(View.VISIBLE);
        // Set rightmost button on the second row invisible so it takes up
        // space and everything centers properly
        mWeekGroup2.getChildAt(3).setVisibility(View.INVISIBLE);
      }
    } else if (mResources.getConfiguration().screenWidthDp > MIN_SCREEN_WIDTH_FOR_SINGLE_ROW_WEEK) {
      numOfButtonsInRow1 = 7;
      numOfButtonsInRow2 = 0;
      mWeekGroup2.setVisibility(View.GONE);
      mWeekGroup2.getChildAt(3).setVisibility(View.GONE);
    } else {
      numOfButtonsInRow1 = 4;
      numOfButtonsInRow2 = 3;

      mWeekGroup2.setVisibility(View.VISIBLE);
      // Set rightmost button on the second row invisible so it takes up
      // space and everything centers properly
      mWeekGroup2.getChildAt(3).setVisibility(View.INVISIBLE);
    }

    /* First row */
    for (int i = 0; i < 7; i++) {
      if (i >= numOfButtonsInRow1) {
        mWeekGroup.getChildAt(i).setVisibility(View.GONE);
        continue;
      }

      mWeekByDayButtons[idx] = (ToggleButton) mWeekGroup.getChildAt(i);
      mWeekByDayButtons[idx].setTextOff(dayOfWeekString[TIME_DAY_TO_CALENDAR_DAY[idx]]);
      mWeekByDayButtons[idx].setTextOn(dayOfWeekString[TIME_DAY_TO_CALENDAR_DAY[idx]]);
      mWeekByDayButtons[idx].setOnCheckedChangeListener(this);

      if (++idx >= 7) {
        idx = 0;
      }
    }

    /* 2nd Row */
    for (int i = 0; i < 3; i++) {
      if (i >= numOfButtonsInRow2) {
        mWeekGroup2.getChildAt(i).setVisibility(View.GONE);
        continue;
      }
      mWeekByDayButtons[idx] = (ToggleButton) mWeekGroup2.getChildAt(i);
      mWeekByDayButtons[idx].setTextOff(dayOfWeekString[TIME_DAY_TO_CALENDAR_DAY[idx]]);
      mWeekByDayButtons[idx].setTextOn(dayOfWeekString[TIME_DAY_TO_CALENDAR_DAY[idx]]);
      mWeekByDayButtons[idx].setOnCheckedChangeListener(this);

      if (++idx >= 7) {
        idx = 0;
      }
    }

    mMonthGroup = (LinearLayout) mView.findViewById(R.id.monthGroup);
    mMonthRepeatByRadioGroup = (RadioGroup) mView.findViewById(R.id.monthGroup);
    mMonthRepeatByRadioGroup.setOnCheckedChangeListener(this);
    mRepeatMonthlyByNthDayOfWeek =
        (RadioButton) mView.findViewById(R.id.repeatMonthlyByNthDayOfTheWeek);
    mRepeatMonthlyByNthDayOfMonth =
        (RadioButton) mView.findViewById(R.id.repeatMonthlyByNthDayOfMonth);

    mDoneButton = (Button) mView.findViewById(R.id.done_button);
    mDoneButton.setOnClickListener(this);

    Button cancelButton = (Button) mView.findViewById(R.id.cancel_button);
    // FIXME no text color for this one ?
    cancelButton.setOnClickListener(
        new OnClickListener() {
          @Override
          public void onClick(View v) {
            dismiss();
          }
        });

    togglePickerOptions();
    updateDialog();
    if (endCountHasFocus) {
      mEndCount.requestFocus();
    }
    return mView;
  }