Skip to content

Instantly share code, notes, and snippets.

@SelvinPL
Created November 24, 2022 13:48
Show Gist options
  • Select an option

  • Save SelvinPL/ed73544da79022634a38e288d7a13088 to your computer and use it in GitHub Desktop.

Select an option

Save SelvinPL/ed73544da79022634a38e288d7a13088 to your computer and use it in GitHub Desktop.
Parent Fragment or Activity should implement DatePicker.Callback
public class DatePicker extends DialogFragment implements DatePickerDialog.OnDateSetListener {
static final Calendar MAX_DATE_VALUE = DateTimeUtils.addYears(DateTimeUtils.today(), 2);
public static DatePicker newInstance(int id, Calendar date) {
return newInstance(id, date, DateTimeUtils.today(), MAX_DATE_VALUE);
}
public static DatePicker newInstance(int id, Calendar date, Calendar minDate, Calendar maxDate) {
DatePicker frag = new DatePicker();
Bundle args = new Bundle();
args.putSerializable(DATE, date);
args.putSerializable(MIN_DATE, minDate);
args.putSerializable(MAX_DATE, maxDate == null ? MAX_DATE_VALUE : maxDate);
args.putInt(ID, id);
frag.setArguments(args);
return frag;
}
@NonNull
public Dialog onCreateDialog(Bundle savedInstanceState) {
final Bundle arguments = requireArguments();
final Calendar calendar = (Calendar) arguments.getSerializable(DATE);
if (calendar != null) {
final DatePickerDialog dialog = new DatePickerDialog(this.requireActivity(), R.style.AppTheme_Light_Dialog, this,
calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH));
setMaxDate(dialog, (Calendar) arguments.getSerializable(MAX_DATE));
setMinDate(dialog, (Calendar) arguments.getSerializable(MIN_DATE));
return dialog;
}
throw new RuntimeException("No DATE argument");
}
@Override
public void onDateSet(android.widget.DatePicker view, int year, int monthOfYear, int dayOfMonth) {
final Bundle arguments = requireArguments();
final Calendar minDate = (Calendar) arguments.getSerializable(MIN_DATE);
final Calendar maxDate = (Calendar) arguments.getSerializable(MAX_DATE);
final Calendar calendar = DateTimeUtils.today();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, monthOfYear);
calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
if (minDate != null && calendar.compareTo(minDate) < 0)
runCallback(arguments.getInt(ID), false, minDate);
else if (maxDate != null && calendar.compareTo(maxDate) > 0)
runCallback(arguments.getInt(ID), false, maxDate);
else
runCallback(arguments.getInt(ID), false, calendar);
}
private void runCallback(final int ID, boolean canceled, Calendar date) {
boolean handled = false;
if (getParentFragment() != null && getParentFragment() instanceof Callback)
handled = ((Callback) getParentFragment()).onAction(ID, canceled, date);
if (!handled && getActivity() instanceof Callback)
((Callback) getActivity()).onAction(ID, canceled, date);
}
public void onCancel(@NonNull DialogInterface dialog) {
final Bundle arguments = requireArguments();
final Calendar calendar = (Calendar) arguments.getSerializable(DATE);
runCallback(arguments.getInt(ID), true, calendar);
super.onCancel(dialog);
}
private void setMaxDate(DatePickerDialog dialog, Calendar maxDate) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N)
dialog.getDatePicker().setCalendarViewShown(false);
dialog.getDatePicker().setMaxDate(maxDate.getTimeInMillis());
}
private void setMinDate(DatePickerDialog dialog, Calendar minDate) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N)
dialog.getDatePicker().setCalendarViewShown(false);
dialog.getDatePicker().setMinDate(minDate.getTimeInMillis());
}
public interface Callback {
boolean onAction(final int ID, boolean canceled, Calendar date);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment