package org.holoeverywhere.preference; import java.util.Calendar; import org.holoeverywhere.app.DatePickerDialog; import org.holoeverywhere.widget.DatePicker; import com.actionbarsherlock.R; import android.app.Dialog; import android.content.Context; import android.content.res.TypedArray; import android.util.AttributeSet; public class DatePreference extends DialogPreference { public static interface OnDateSetListener { public boolean onDateSet(DatePreference preference, long date, int year, int month, int day); } private final DatePickerDialog.OnDateSetListener mCallback = new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker datePicker, int year, int month, int day) { Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(0); calendar.set(Calendar.YEAR, mYear = year); calendar.set(Calendar.MONTH, mMonth = month); calendar.set(Calendar.DAY_OF_MONTH, mDay = day); DatePreference.this.onDateSet(datePicker, calendar.getTimeInMillis(), year, month, day); updateDialogState(); } }; private long mDefaultDate; private boolean mDefaultDateSetted = false; private OnDateSetListener mOnDateSetListener; private int mYear, mMonth, mDay; public DatePreference(Context context) { this(context, null); } public DatePreference(Context context, AttributeSet attrs) { this(context, attrs, R.attr.datePreferenceStyle); } public DatePreference(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); context = getContext(); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DatePreference, defStyle, R.style.Holo_PreferenceDate); a.recycle(); } public int getDay() { return mDay; } public long getDefaultDate() { if (!mDefaultDateSetted) { return System.currentTimeMillis(); } return mDefaultDate; } public int getMonth() { return mMonth; } public OnDateSetListener getOnDateSetListener() { return mOnDateSetListener; } public int getYear() { return mYear; } @Override protected Dialog onCreateDialog(Context context) { return new DatePickerDialog(context, mCallback, mYear, mMonth, mDay); } public void onDateSet(DatePicker datePicker, long date, int year, int month, int day) { if (mOnDateSetListener == null || mOnDateSetListener.onDateSet(this, date, year, month, day)) { persistLong(date); } } @Override protected String onGetDefaultValue(TypedArray a, int index) { String value = a.getString(index); if (value == null || value.length() == 0) { value = String.valueOf(getDefaultDate()); } return value; } @Override protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) { if (restorePersistedValue) { defaultValue = getPersistedLong(getDefaultDate()); } long time; try { if (defaultValue instanceof Long) { time = ((Long) defaultValue).longValue(); } else { time = Long.parseLong(String.valueOf(defaultValue)); } time = Long.parseLong(String.valueOf(defaultValue)); } catch (Exception e) { time = getDefaultDate(); } setTime(time); } public void resetDefaultDate() { mDefaultDateSetted = false; } public void setDay(int day) { mDay = day; updateDialogState(); } public void setDefaultDate(long defaultDate) { mDefaultDate = defaultDate; mDefaultDateSetted = true; } public void setMonth(int month) { mMonth = month; updateDialogState(); } public void setOnDateSetListener(OnDateSetListener onTimeSetListener) { mOnDateSetListener = onTimeSetListener; } private void setTime(long time) { Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(time); mYear = calendar.get(Calendar.YEAR); mMonth = calendar.get(Calendar.MONTH); mDay = calendar.get(Calendar.DAY_OF_MONTH); updateDialogState(); } public void setYear(int year) { mYear = year; updateDialogState(); } protected void updateDialogState() { DatePickerDialog dialog = (DatePickerDialog) getDialog(); if (dialog != null) { dialog.updateDate(mYear, mMonth, mDay); } } }