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 private 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}