package com.jdroid.android.date; import android.app.Dialog; import android.content.DialogInterface; import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v7.app.AlertDialog; import android.text.format.DateUtils; import android.view.View; import android.widget.DatePicker; import android.widget.DatePicker.OnDateChangedListener; import com.jdroid.android.R; import com.jdroid.android.dialog.AbstractDialogFragment; import com.jdroid.android.utils.AndroidUtils; import com.jdroid.android.utils.DeviceUtils; import java.util.Date; public class DatePickerDialogFragment extends AbstractDialogFragment implements OnDateChangedListener { private static final String DEFAULT_DATE_EXTRA = "defaultDate"; private static final String MIN_DATE_EXTRA = "minDate"; private static final String MAX_DATE_EXTRA = "maxDate"; private static final String TITLE_EXTRA = "title"; public static void show(Fragment targetFragment, Date defaultDate) { DatePickerDialogFragment.show(targetFragment, defaultDate, null); } public static void show(Fragment targetFragment, Date defaultDate, Integer titleResId) { DatePickerDialogFragment.show(targetFragment, defaultDate, titleResId, null); } public static void show(Fragment targetFragment, Date defaultDate, Integer titleResId, Date minDate) { DatePickerDialogFragment.show(targetFragment, defaultDate, titleResId, minDate, null); } public static void show(Fragment targetFragment, Date defaultDate, Integer titleResId, Date minDate, Date maxDate) { DatePickerDialogFragment.show(targetFragment, defaultDate, titleResId, minDate, maxDate, 1); } public static void show(Fragment targetFragment, Date defaultDate, Integer titleResId, Date minDate, Date maxDate, int requestCode) { FragmentManager fm = targetFragment.getActivity().getSupportFragmentManager(); DatePickerDialogFragment fragment = new DatePickerDialogFragment(); Bundle bundle = new Bundle(); bundle.putSerializable(DEFAULT_DATE_EXTRA, defaultDate); if (titleResId != null) { bundle.putInt(TITLE_EXTRA, titleResId); } bundle.putSerializable(MIN_DATE_EXTRA, minDate); bundle.putSerializable(MAX_DATE_EXTRA, maxDate); fragment.setArguments(bundle); fragment.setTargetFragment(targetFragment, requestCode); fragment.show(fm, DatePickerDialogFragment.class.getSimpleName()); } private Date defaultDate; private Date minDate; private Date maxDate; private Integer titleResId; /** * The callback used to indicate the user is done filling in the date. */ public interface OnDateSetListener { public void onDateSet(Date date, int requestCode); } /** * @see com.jdroid.android.dialog.AbstractDialogFragment#onCreate(android.os.Bundle) */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); defaultDate = getArgument(DEFAULT_DATE_EXTRA); titleResId = getArgument(TITLE_EXTRA); minDate = getArgument(MIN_DATE_EXTRA); maxDate = getArgument(MAX_DATE_EXTRA); } @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(getActivity()); View view = inflate(R.layout.jdroid_date_picker_dialog_fragment); dialogBuilder.setView(view); final DatePicker datePicker = (DatePicker)view.findViewById(R.id.datePicker); datePicker.init(com.jdroid.java.date.DateUtils.getYear(defaultDate), com.jdroid.java.date.DateUtils.getMonth(defaultDate), com.jdroid.java.date.DateUtils.getDayOfMonth(defaultDate), this); if (titleResId != null) { dialogBuilder.setTitle(titleResId); } Boolean disableMinMaxDate = disableMinMaxDate(); if ((minDate != null) && !disableMinMaxDate) { datePicker.setMinDate(minDate.getTime()); } if ((maxDate != null) && !disableMinMaxDate) { datePicker.setMaxDate(maxDate.getTime()); } dialogBuilder.setPositiveButton(getString(R.string.jdroid_ok), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int whichButton) { Date date = com.jdroid.java.date.DateUtils.getDate(datePicker.getYear(), datePicker.getMonth(), datePicker.getDayOfMonth()); int requestCode = getTargetRequestCode(); ((OnDateSetListener)getTargetFragment()).onDateSet(date, requestCode); } }); dialogBuilder.setNegativeButton(getString(R.string.jdroid_cancel), null); Dialog dialog = dialogBuilder.create(); updateTitle(dialog, defaultDate); return dialog; } private Boolean disableMinMaxDate() { // Disable the min/max date feature on devices where it crashes if ((AndroidUtils.getApiLevel() >= Build.VERSION_CODES.JELLY_BEAN) && (AndroidUtils.getApiLevel() <= Build.VERSION_CODES.JELLY_BEAN_MR1)) { String model = DeviceUtils.getDeviceModel(); if ((model != null) && (model.equals("Nexus 7") || model.contains("ST26i") || model.contains("ST26a") || model.contains("Galaxy Nexus") || model.contains("Amazon Kindle Fire"))) { return true; } } return false; } @Override public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) { if (titleResId == null) { updateTitle(year, monthOfYear, dayOfMonth); } } private void updateTitle(int year, int month, int day) { Date date = com.jdroid.java.date.DateUtils.getDate(year, month, day); updateTitle(getDialog(), date); } private void updateTitle(Dialog dialog, Date date) { if (dialog != null && AndroidUtils.isPreLollipop()) { String title = DateUtils.formatDateTime(getActivity(), date.getTime(), DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_WEEKDAY | DateUtils.FORMAT_SHOW_YEAR | DateUtils.FORMAT_ABBREV_MONTH | DateUtils.FORMAT_ABBREV_WEEKDAY); dialog.setTitle(title); } } }