package com.zapta.apps.maniana.editors;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import android.app.Dialog;
import android.content.DialogInterface;
import android.text.format.DateUtils;
import android.view.Gravity;
import android.widget.DatePicker;
import android.widget.TimePicker;
import com.zapta.apps.maniana.R;
import com.zapta.apps.maniana.annotations.MainActivityScope;
import com.zapta.apps.maniana.main.MainActivityState;
import com.zapta.apps.maniana.util.PopupsTracker.TrackablePopup;
@MainActivityScope
public class ItemTimePicker extends Dialog implements TrackablePopup {
public interface ItemTimePickerListener {
void onDismiss(Date finalDate);
}
private final MainActivityState mMainActivityState;
private final ItemTimePickerListener mListener;
private final DatePicker mDatePicker;
private final TimePicker mTimePicker;
/** Used to avoid double reporting of dismissal. */
private boolean dismissAlreadyReported = false;
private GregorianCalendar mCalendar;
private ItemTimePicker(final MainActivityState mainActivityState,
Date initialItemDate, ItemTimePickerListener listener) {
super(mainActivityState.context());
mMainActivityState = mainActivityState;
mListener = listener;
mCalendar = new GregorianCalendar(); // FIXME: make sure we use good
// calendar & timezone here
mCalendar.setTime(initialItemDate);
setContentView(R.layout.dialog_datetime_picker);
updateTitle();
setOwnerActivity(mainActivityState.mainActivity());
// FIXME: allow clearing item date (?)
// FIXME: try to start this dialog from ItemTextEditor, not from ItemMenu?
// FIXME: add OK (Save?)/Cancel
// FIXME: make sure that the dialog fits in screen
// Get sub views
mDatePicker = (DatePicker) findViewById(R.id.date_picker);
mTimePicker = (TimePicker) findViewById(R.id.time_picker);
// mColorView = findViewById(R.id.editor_color); // FIXME: do we need
// this too?
// mDatePicker.setMinDate() // TODO: add if possible in API v8
mDatePicker.init(mCalendar.get(Calendar.YEAR),
mCalendar.get(Calendar.MONTH),
mCalendar.get(Calendar.DAY_OF_MONTH),
new DatePicker.OnDateChangedListener() {
@Override
public void onDateChanged(DatePicker view, int year,
int monthOfYear, int dayOfMonth) {
mCalendar.set(year, monthOfYear, dayOfMonth);
updateTitle();
}
});
mTimePicker.setCurrentHour(mCalendar.get(Calendar.HOUR_OF_DAY));
mTimePicker.setCurrentMinute(mCalendar.get(Calendar.MINUTE));
mTimePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {
@Override
public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
mCalendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
mCalendar.set(Calendar.MINUTE, minute);
updateTitle();
}
});
// TODO: do we need this below?
/*
* // For API 11+ these values come from the default theme. For holo, //
* this will be white text on dark gray background. This makes sure the
* // text // cursor is at at color visible over the background.:w if
* (PRE_API_11) { final View topView = findViewById(R.id.editor_top);
* topView.setBackgroundColor(0xffffffff);
* mExtendedEditTextView.setBackgroundColor(0xffffffff);
* mExtendedEditTextView.setTextColor(0xff000000); }
*
* mainActivityState.prefTracker().getPageItemFontVariation()
* .apply(mExtendedEditTextView, false, false);
*/
// EditorEventAdapter eventAdapter = new EditorEventAdapter();
setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss(DialogInterface arg0) {
handleOnDismiss();
}
});
// FIXME: if possible, add listener to mDatePicker, to display full date
// in dialog title, especially with weekday info !!
getWindow().setGravity(Gravity.TOP);
}
private void updateTitle() {
// TODO Auto-generated method stub
setTitle(DateUtils.formatDateTime(getContext(),
mCalendar.getTimeInMillis(), DateUtils.FORMAT_SHOW_WEEKDAY
| DateUtils.FORMAT_ABBREV_WEEKDAY
| DateUtils.FORMAT_SHOW_DATE
| DateUtils.FORMAT_SHOW_TIME));
}
/** Called when the dialog get dismissed. */
private final void handleOnDismiss() {
mMainActivityState.popupsTracker().untrack(this);
// If not already reported during the close leftover.
if (!dismissAlreadyReported) {
mListener.onDismiss(mCalendar.getTime());
}
}
/** Called when the dialog was left open and the main activity pauses. */
@Override
public final void closeLeftOver() {
if (isShowing()) {
// We provide an early dismiss event. Otherwise, this would be reported later when the
// UI thread will get to handle the queued event. The controller rely on the fact that
// the editor was dismissed and any pending new item text was submitted to the model.
dismissAlreadyReported = true;
mListener.onDismiss(mCalendar.getTime());
dismiss();
}
}
/**
* Show a date/time picker.
*
* @param mainActivityState
* mainActivityState context.
* @param title
* title to display in the editor.
* @param initialText
* initial edited item text
* @param listener
* listener to callback on changes and on end.
*/
public static void startEditor(final MainActivityState mainActivityState,
Date date, final ItemTimePickerListener listener) {
final ItemTimePicker dialog = new ItemTimePicker(mainActivityState,
date, listener);
mainActivityState.popupsTracker().track(dialog);
dialog.show();
}
}