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
15public class TimePreference extends DialogPreference implements Preference.OnPreferenceChangeListener {
16 private TimePicker picker = null;
17 public final static long DEFAULT_VALUE = 0;
18
19 public TimePreference(final Context context, final AttributeSet attrs) {
20 super(context, attrs, 0);
21 this.setOnPreferenceChangeListener(this);
22 }
23
24 protected void setTime(final long time) {
25 persistLong(time);
26 notifyDependencyChange(shouldDisableDependents());
27 notifyChanged();
28 }
29
30 protected void updateSummary(final long time) {
31 final DateFormat dateFormat = android.text.format.DateFormat.getTimeFormat(getContext());
32 final Date date = new Date(time);
33 setSummary(dateFormat.format(date.getTime()));
34 }
35
36 @Override
37 protected View onCreateDialogView() {
38 picker = new TimePicker(getContext());
39 picker.setIs24HourView(android.text.format.DateFormat.is24HourFormat(getContext()));
40 return picker;
41 }
42
43 protected Calendar getPersistedTime() {
44 final Calendar c = Calendar.getInstance();
45 c.setTimeInMillis(getPersistedLong(DEFAULT_VALUE));
46
47 return c;
48 }
49
50 @SuppressWarnings("NullableProblems")
51 @Override
52 protected void onBindDialogView(final View v) {
53 super.onBindDialogView(v);
54 final Calendar c = getPersistedTime();
55
56 picker.setCurrentHour(c.get(Calendar.HOUR_OF_DAY));
57 picker.setCurrentMinute(c.get(Calendar.MINUTE));
58 }
59
60 @Override
61 protected void onDialogClosed(final boolean positiveResult) {
62 super.onDialogClosed(positiveResult);
63
64 if (positiveResult) {
65 final Calendar c = Calendar.getInstance();
66 c.set(Calendar.MINUTE, picker.getCurrentMinute());
67 c.set(Calendar.HOUR_OF_DAY, picker.getCurrentHour());
68
69
70 if (!callChangeListener(c.getTimeInMillis())) {
71 return;
72 }
73
74 setTime(c.getTimeInMillis());
75 }
76 }
77
78 @Override
79 protected Object onGetDefaultValue(final TypedArray a, final int index) {
80 return a.getInteger(index, 0);
81 }
82
83 @Override
84 protected void onSetInitialValue(final boolean restorePersistedValue, final Object defaultValue) {
85 long time;
86 if (defaultValue == null) {
87 time = restorePersistedValue ? getPersistedLong(DEFAULT_VALUE) : DEFAULT_VALUE;
88 } else if (defaultValue instanceof Long) {
89 time = restorePersistedValue ? getPersistedLong((Long) defaultValue) : (Long) defaultValue;
90 } else if (defaultValue instanceof Calendar) {
91 time = restorePersistedValue ? getPersistedLong(((Calendar)defaultValue).getTimeInMillis()) : ((Calendar)defaultValue).getTimeInMillis();
92 } else {
93 time = restorePersistedValue ? getPersistedLong(DEFAULT_VALUE) : DEFAULT_VALUE;
94 }
95
96 setTime(time);
97 updateSummary(time);
98 }
99
100 @Override
101 public boolean onPreferenceChange(final Preference preference, final Object newValue) {
102 ((TimePreference) preference).updateSummary((Long)newValue);
103 return true;
104 }
105}