package ca.josephroque.bowlingcompanion.dialog; import android.app.DatePickerDialog; import android.app.Dialog; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.DialogFragment; import android.widget.DatePicker; import java.lang.reflect.Field; import ca.josephroque.bowlingcompanion.Constants; import ca.josephroque.bowlingcompanion.utilities.DateUtils; import ca.josephroque.bowlingcompanion.wrapper.Series; /** * Created by Joseph Roque on 15-03-29. Provides a dialog and callback interface {@link * ChangeDateDialog.ChangeDateDialogListener} for the user to change the date associated with a series */ public class ChangeDateDialog extends DialogFragment implements DatePickerDialog.OnDateSetListener { /** Identifies output from this class in Logcat. */ @SuppressWarnings("unused") private static final String TAG = "ChangeDateDialog"; /** Number of components which make up a date. */ private static final byte TOTAL_DATE_COMPONENTS = 3; /** Dialog which allows user to select a date from a calendar. */ private DatePickerDialog mDatePicker; /** Callback listener for when user selects a date. */ private ChangeDateDialogListener mChangeDateListener; /** Series being edited. */ private Series mSeries; @Override @NonNull public Dialog onCreateDialog(Bundle savedInstanceState) { int[] date; if (savedInstanceState == null) { mSeries = getArguments().getParcelable(Constants.EXTRA_SERIES); assert mSeries != null; date = DateUtils.prettyCompactToFormattedDate(mSeries.getSeriesDate()); date[0] -= 1; // Must subtract one because method returns 1-12 for month, need 0-11 } else { mSeries = savedInstanceState.getParcelable(Constants.EXTRA_SERIES); date = savedInstanceState.getIntArray(Constants.EXTRA_NAME_SERIES); } if (date != null && date.length == TOTAL_DATE_COMPONENTS) mDatePicker = new DatePickerDialog(getContext(), this, date[2], date[0], date[1]); else throw new IllegalStateException("must instantiate date with 3 values: year, month, day"); return mDatePicker; } @Override public void onDateSet(DatePicker view, int year, int month, int day) { mChangeDateListener.onChangeDate(mSeries, year, month, day); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); DatePicker datePicker; try { Field datePickerField = mDatePicker.getClass().getField("mDatePicker"); datePickerField.setAccessible(true); datePicker = (DatePicker) datePickerField.get(mDatePicker); } catch (Exception ex) { throw new RuntimeException("Changing series date: " + ex.getMessage()); } int[] currentDate = new int[TOTAL_DATE_COMPONENTS]; currentDate[0] = datePicker.getMonth(); currentDate[1] = datePicker.getDayOfMonth(); currentDate[2] = datePicker.getYear(); outState.putIntArray(Constants.EXTRA_NAME_SERIES, currentDate); outState.putParcelable(Constants.EXTRA_SERIES, mSeries); } /** * Returns a new instance of this dialog fragment with the listener assigned and arguments set. * * @param listener callback listener for user events * @param series identifies the series to be changed * @return a new instance ChangeDateDialog */ public static ChangeDateDialog newInstance(ChangeDateDialogListener listener, Series series) { ChangeDateDialog dialog = new ChangeDateDialog(); dialog.mChangeDateListener = listener; Bundle args = new Bundle(); args.putParcelable(Constants.EXTRA_SERIES, series); dialog.setArguments(args); return dialog; } /** * Callback listener for user events. */ public interface ChangeDateDialogListener { /** * Called when the user selects a date to set. * * @param series series to change * @param year year to change date to * @param month month to change date to * @param day day of the month to change date to */ void onChangeDate(Series series, int year, int month, int day); } }