1package eu.siacs.conversations.ui;
 2
 3import android.content.Context;
 4import android.content.res.TypedArray;
 5import android.preference.DialogPreference;
 6import android.preference.Preference;
 7import android.util.AttributeSet;
 8import android.view.View;
 9import android.widget.TimePicker;
10
11import java.text.DateFormat;
12import java.util.Calendar;
13import java.util.Date;
14
15
16public class TimePreference extends DialogPreference implements Preference.OnPreferenceChangeListener {
17	private TimePicker picker = null;
18	public final static long DEFAULT_VALUE = 0;
19
20	public TimePreference(final Context context, final AttributeSet attrs) {
21		super(context, attrs, 0);
22		this.setOnPreferenceChangeListener(this);
23	}
24
25	protected void setTime(final long time) {
26		persistLong(time);
27		notifyDependencyChange(shouldDisableDependents());
28		notifyChanged();
29		updateSummary(time);
30	}
31
32	private void updateSummary(final long time) {
33		final DateFormat dateFormat = android.text.format.DateFormat.getTimeFormat(getContext());
34		final Date date = minutesToCalender(time).getTime();
35		setSummary(dateFormat.format(date.getTime()));
36	}
37
38	@Override
39	protected View onCreateDialogView() {
40		picker = new TimePicker(getContext());
41		picker.setIs24HourView(android.text.format.DateFormat.is24HourFormat(getContext()));
42		return picker;
43	}
44
45	@SuppressWarnings("NullableProblems")
46	@Override
47	protected void onBindDialogView(final View v) {
48		super.onBindDialogView(v);
49		long time = getPersistedLong(DEFAULT_VALUE);
50
51		picker.setCurrentHour((int) ((time % (24 * 60)) / 60));
52		picker.setCurrentMinute((int) ((time % (24 * 60)) % 60));
53	}
54
55	@Override
56	protected void onDialogClosed(final boolean positiveResult) {
57		super.onDialogClosed(positiveResult);
58
59		if (positiveResult) {
60			setTime(picker.getCurrentHour() * 60 + picker.getCurrentMinute());
61		}
62	}
63
64	public static Calendar minutesToCalender(long time) {
65		final Calendar c = Calendar.getInstance();
66		c.set(Calendar.HOUR_OF_DAY, (int) ((time % (24 * 60)) / 60));
67		c.set(Calendar.MINUTE, (int) ((time % (24 * 60)) % 60));
68		return c;
69	}
70
71	public static long minutesToTimestamp(long time) {
72		return minutesToCalender(time).getTimeInMillis();
73	}
74
75	@Override
76	protected Object onGetDefaultValue(final TypedArray a, final int index) {
77		return a.getInteger(index, 0);
78	}
79
80	@Override
81	protected void onSetInitialValue(final boolean restorePersistedValue, final Object defaultValue) {
82		long time;
83		if (defaultValue instanceof Long) {
84			time = restorePersistedValue ? getPersistedLong((Long) defaultValue) : (Long) defaultValue;
85		} else {
86			time = restorePersistedValue ? getPersistedLong(DEFAULT_VALUE) : DEFAULT_VALUE;
87		}
88
89		setTime(time);
90		updateSummary(time);
91	}
92
93	@Override
94	public boolean onPreferenceChange(final Preference preference, final Object newValue) {
95		((TimePreference) preference).updateSummary((Long)newValue);
96		return true;
97	}
98}