package de.saxsys.android.projectiler.app.ui; import android.content.Context; import android.content.DialogInterface; import android.content.SharedPreferences; import android.content.res.TypedArray; import android.os.Parcel; import android.os.Parcelable; import android.preference.DialogPreference; import android.util.AttributeSet; import android.view.View; import android.widget.TimePicker; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; /** * Created by stefan.heinze on 25.05.2014. */ public class TimePreference extends DialogPreference implements TimePicker.OnTimeChangedListener { private String dateString; private String changedValueCanBeNull; private TimePicker datePicker; public TimePreference(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public TimePreference(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected View onCreateDialogView() { this.datePicker = new TimePicker(getContext()); String time = getTime(); String[] split = time.split(":"); datePicker.setCurrentHour(Integer.parseInt(split[0])); datePicker.setCurrentMinute(Integer.parseInt(split[1])); return datePicker; } public String getTime() { return defaultValue(); } public void setDate(String dateString) { this.dateString = dateString; } public static SimpleDateFormat formatter() { return new SimpleDateFormat("yyyy.MM.dd"); } public static SimpleDateFormat summaryFormatter() { return new SimpleDateFormat("MMMM dd, yyyy"); } @Override protected Object onGetDefaultValue(TypedArray a, int index) { return a.getString(index); } @Override protected void onSetInitialValue(boolean restoreValue, Object def) { if (restoreValue) { this.dateString = getPersistedString(defaultValue()); setTheDate(this.dateString); } else { boolean wasNull = this.dateString == null; setDate((String) def); persistDate(this.dateString); } } @Override protected Parcelable onSaveInstanceState() { if (isPersistent()) return super.onSaveInstanceState(); else return new SavedState(super.onSaveInstanceState()); } @Override protected void onRestoreInstanceState(Parcelable state) { if (state == null || !state.getClass().equals(SavedState.class)) { super.onRestoreInstanceState(state); setTheDate(((SavedState) state).dateValue); } else { SavedState s = (SavedState) state; super.onRestoreInstanceState(s.getSuperState()); setTheDate(s.dateValue); } } @Override protected void onDialogClosed(boolean shouldSave) { if (shouldSave && this.changedValueCanBeNull != null) { setTheDate(this.changedValueCanBeNull); this.changedValueCanBeNull = null; } } private void setTheDate(String s) { setDate(s); persistDate(s); } private void persistDate(String s) { persistString(s); setSummary(s); } public static Calendar defaultCalendar() { return new GregorianCalendar(1970, 0, 1); } public static String defaultCalendarString() { return formatter().format(defaultCalendar().getTime()); } private String defaultValue() { if (this.dateString == null) setDate(defaultCalendarString()); return this.dateString; } @Override public void onClick(DialogInterface dialog, int which) { super.onClick(dialog, which); datePicker.clearFocus(); onTimeChanged(datePicker, datePicker.getCurrentHour(), datePicker.getCurrentMinute()); onDialogClosed(which == DialogInterface.BUTTON1); // OK? } public static Calendar getDateFor(SharedPreferences preferences, String field) { Date date = stringToDate(preferences.getString(field, defaultCalendarString())); Calendar cal = Calendar.getInstance(); cal.setTime(date); return cal; } private static Date stringToDate(String dateString) { try { return formatter().parse(dateString); } catch (ParseException e) { return defaultCalendar().getTime(); } } @Override public void onTimeChanged(TimePicker timePicker, int hours, int minutes) { if(minutes < 10){ this.changedValueCanBeNull = hours + ":0" + minutes; }else{ this.changedValueCanBeNull = hours + ":" + minutes; } } private static class SavedState extends BaseSavedState { String dateValue; public SavedState(Parcel p) { super(p); dateValue = p.readString(); } public SavedState(Parcelable p) { super(p); } @Override public void writeToParcel(Parcel out, int flags) { super.writeToParcel(out, flags); out.writeString(dateValue); } @SuppressWarnings("unused") public static final Parcelable.Creator<SavedState> CREATOR = new Parcelable.Creator<SavedState>() { public SavedState createFromParcel(Parcel in) { return new SavedState(in); } public SavedState[] newArray(int size) { return new SavedState[size]; } }; } }