package org.ohmage.widget;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import org.ohmage.R;
import android.content.Context;
import android.os.Parcel;
import android.os.Parcelable;
import android.preference.DialogPreference;
import android.preference.PreferenceManager;
import android.util.AttributeSet;
import android.view.View;
import android.widget.DatePicker;
public class DatePreference extends DialogPreference {
private DatePicker picker = null;
public DatePreference(Context ctxt) {
this(ctxt, null);
}
public DatePreference(Context ctxt, AttributeSet attrs) {
this(ctxt, attrs, 0);
}
public DatePreference(Context ctxt, AttributeSet attrs, int defStyle) {
super(ctxt, attrs, defStyle);
setPositiveButtonText(R.string.set);
setNegativeButtonText(R.string.cancel);
}
@Override
protected void onAttachedToHierarchy(PreferenceManager preferenceManager) {
super.onAttachedToHierarchy(preferenceManager);
long time = getPersistedLong(0);
if (time != 0) {
setSummaryTime(time);
}
}
@Override
protected View onCreateDialogView() {
picker = new DatePicker(getContext());
return picker;
}
@Override
protected void onBindDialogView(View v) {
super.onBindDialogView(v);
long time = getPersistedLong(0);
if (time != 0) {
setTime(time);
}
}
@Override
protected void onDialogClosed(boolean positiveResult) {
super.onDialogClosed(positiveResult);
if (positiveResult) {
long time = getTime();
if (callChangeListener(time)) {
persistLong(time);
setSummaryTime(time);
}
}
}
private void setSummaryTime(long time) {
setSummary(SimpleDateFormat.getDateInstance().format(time));
}
public long getTime() {
if (picker != null) {
Calendar cal = Calendar.getInstance();
cal.clear();
cal.set(picker.getYear(), picker.getMonth(), picker.getDayOfMonth());
return cal.getTimeInMillis();
}
return 0;
}
public void setTime(long time) {
if (picker != null) {
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(time);
picker.updateDate(cal.get(Calendar.YEAR), cal.get(Calendar.MONDAY),
cal.get(Calendar.DAY_OF_MONTH));
setSummaryTime(cal.getTimeInMillis());
}
}
@Override
protected Parcelable onSaveInstanceState() {
final Parcelable superState = super.onSaveInstanceState();
if (picker == null) {
return superState;
}
final SavedState myState = new SavedState(superState);
myState.time = getTime();
return myState;
}
@Override
protected void onRestoreInstanceState(Parcelable state) {
if (state == null || !state.getClass().equals(SavedState.class)) {
// Didn't save state for us in onSaveInstanceState
super.onRestoreInstanceState(state);
return;
}
SavedState myState = (SavedState) state;
super.onRestoreInstanceState(myState.getSuperState());
setTime(myState.time);
}
private static class SavedState extends BaseSavedState {
long time;
public SavedState(Parcel source) {
super(source);
time = source.readLong();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeLong(time);
}
public SavedState(Parcelable superState) {
super(superState);
}
}
}