package com.evancharlton.mileage.views;
import android.app.DatePickerDialog;
import android.app.DatePickerDialog.OnDateSetListener;
import android.content.Context;
import android.os.Bundle;
import android.os.Parcelable;
import android.util.AttributeSet;
import android.view.View;
import android.view.WindowManager.BadTokenException;
import android.widget.Button;
import android.widget.DatePicker;
import java.sql.Date;
import java.text.DateFormat;
import java.util.Calendar;
public class DateButton extends Button {
private long mTimestamp = System.currentTimeMillis();
private final DateFormat mDateFormatter;
private final Calendar mCalendar;
private static StaticDatePickerDialog mDialog;
private final OnDateSetListener mDateSetCallback = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
mDialog = null;
mCalendar.set(Calendar.YEAR, year);
mCalendar.set(Calendar.MONTH, monthOfYear);
mCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
setDate(mCalendar.getTimeInMillis());
}
};
public DateButton(final Context context, AttributeSet attrs) {
super(context, attrs);
super.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showDialog();
}
});
mDateFormatter = android.text.format.DateFormat.getDateFormat(context);
mCalendar = Calendar.getInstance();
setDate(System.currentTimeMillis());
}
private void showDialog() {
mDialog = new StaticDatePickerDialog(getContext(), mDateSetCallback, mCalendar);
mDialog.show();
}
@Override
public Parcelable onSaveInstanceState() {
Bundle icicle = new Bundle();
icicle.putParcelable("super", super.onSaveInstanceState());
icicle.putLong("timestamp", getTimestamp());
if (mDialog != null) {
mDialog.dismiss();
}
return icicle;
}
@Override
public void onRestoreInstanceState(Parcelable state) {
Bundle icicle = (Bundle) state;
super.onRestoreInstanceState(icicle.getParcelable("super"));
setDate(icicle.getLong("timestamp", System.currentTimeMillis()));
if (mDialog != null) {
mDialog.setCallback(mDateSetCallback);
try {
if (!mDialog.isShowing()) {
mDialog.show();
}
} catch (BadTokenException e) {
// silently fail
}
}
}
public void setDate(Date date) {
mCalendar.setTime(date);
mTimestamp = mCalendar.getTimeInMillis();
setText(mDateFormatter.format(date));
}
public void setDate(long timestamp) {
setDate(new Date(timestamp));
}
public long getTimestamp() {
return mTimestamp;
}
public Date getDate() {
return new Date(mTimestamp);
}
private static class StaticDatePickerDialog extends DatePickerDialog {
private OnDateSetListener mCallback;
public StaticDatePickerDialog(Context context, OnDateSetListener callback, Calendar calendar) {
super(context, callback, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH));
mCallback = callback;
}
public void setCallback(OnDateSetListener callback) {
mCallback = callback;
}
@Override
public void onDateChanged(DatePicker picker, int year, int month, int day) {
super.onDateChanged(picker, year, month, day);
mCallback.onDateSet(picker, year, month, day);
}
}
}