source: trunk/hiptop/pester/net/sabi/pester/Alarms.java@ 278

Last change on this file since 278 was 278, checked in by Nicholas Riley, 18 years ago

Display message on empty list (no longer need to add/remove border). Don't let alarms go off while you're deciding whether to discard them. First, untested attempt at handling hard resets (waiting on advice from Danger). Very ugly rewrite of alarm alert; needs much fixing.

File size: 4.1 KB
Line 
1package net.sabi.pester;
2
3import java.util.Comparator;
4import danger.app.Application;
5import danger.app.DataStore;
6import danger.app.Event;
7import danger.app.SettingsDB;
8import danger.app.SettingsDBException;
9import danger.internal.Date;
10import danger.util.StdActiveList;
11import danger.util.DEBUG;
12
13public class Alarms extends StdActiveList {
14 // max # records in a datastore
15 private static final int MAX_ALARM_COUNT = 50;
16
17 private static Alarms sAlarmList = null;
18 private static Listener sListener;
19 private static SettingsDB sSettingsDB;
20
21 private DataStore mDataStore;
22
23 private Alarms() {
24 mDataStore = DataStore.createDataStore("alarms", true /* auto sync */);
25 // register us for Event.EVENT_DATASTORE_RESTORED, which only
26 // seems to be documented at:
27 // <http://developer.danger.com/forum/index.php?t=msg&th=27>
28 mDataStore.setAutoSyncNotifyee(sListener);
29 refreshFromDataStore(false);
30 }
31
32 void refreshFromDataStore(boolean datastoreRestored) {
33 sAlarmList = null;
34 removeAllItems();
35 if (datastoreRestored)
36 mDataStore.doneResolvingConflict(); // resolves UID conflicts
37 byte[][] alarmsData = mDataStore.getRecords();
38 int i;
39 for (i = 0 ; i < alarmsData.length ; ++i) {
40 Alarm alarm = new Alarm();
41 alarm.fromByteArray(alarmsData[i]);
42 alarm.setUID(mDataStore.getRecordUID(i));
43 insertItemSorted(alarm, alarm);
44 alarm.resume();
45 }
46 sAlarmList = this;
47 }
48
49 public static Alarms getList() {
50 if (sAlarmList == null) {
51 Application.registerForEvent(sListener, Event.EVENT_TIME_CHANGED);
52 sSettingsDB = new SettingsDB("settings", true /* auto sync */);
53 sListener = new Listener();
54 new Alarms();
55 }
56 return sAlarmList;
57 }
58
59 public static void addAlarm(Alarm alarm) {
60 sAlarmList.insertItemSorted(alarm, alarm);
61 }
62 public static void removeAlarm(Alarm alarm) {
63 sAlarmList.removeItem(alarm);
64 }
65
66 protected void onItemAdded(Object item, int index) {
67 if (sAlarmList == null) // restoring from service
68 return;
69 Alarm alarm = (Alarm)item;
70 DEBUG.p("adding: " + alarm +
71 " next UID: " + mDataStore.getAutoSyncNextUID());
72 index = mDataStore.addRecord(alarm.toByteArray());
73 alarm.setUID(mDataStore.getRecordUID(index));
74 DEBUG.p("added UID " + alarm.getUID() + " @ " + index);
75 }
76
77 protected void onItemRemoved(Object item, int index) {
78 if (sAlarmList == null) // restoring from service (after hard reset)
79 return;
80 Alarm alarm = (Alarm)item;
81 int uid = alarm.getUID();
82 if (uid == 0)
83 return;
84 mDataStore.removeRecordByUID(uid);
85 }
86
87 public void onItemUpdated(Object item, int index) {
88 if (sAlarmList == null) // restoring from service
89 return;
90 Alarm alarm = (Alarm)item;
91 mDataStore.setRecordDataByUID(alarm.getUID(), alarm.toByteArray(), true);
92 DEBUG.p("updated: " + alarm + " UID " + alarm.getUID());
93 }
94
95 private static String KEY_DEFAULT_ALARM = "default alarm";
96
97 public static Alarm getDefaultAlarm() {
98 Alarm defaultAlarm = new Alarm();
99 try {
100 defaultAlarm.fromByteArray(sSettingsDB.getBytes(KEY_DEFAULT_ALARM));
101 } catch (SettingsDBException e) {
102 defaultAlarm = new Alarm();
103 defaultAlarm.setDate(new Date());
104 defaultAlarm.setPeriod(600, false);
105 }
106 return defaultAlarm;
107 }
108 public static void setDefaultAlarm(Alarm alarm) {
109 sSettingsDB.setBytes(KEY_DEFAULT_ALARM, alarm.toByteArray());
110 }
111
112 static class Listener extends danger.app.Listener
113 implements danger.util.ActiveList.ForEach {
114
115 public void receive(Object item) {
116 ((Alarm)item).timeChanged();
117 }
118
119 public boolean receiveEvent(Event e) {
120 if (e.type == Event.EVENT_TIME_CHANGED) {
121 Alarms.getList().forEach(this);
122 return true;
123 } else if (e.type == Event.EVENT_DATASTORE_RESTORED) {
124 String dbName = (String)e.argument;
125 DEBUG.p("DATASTORE_RESTORED: " + dbName);
126 if (!dbName.endsWith("alarms")) {
127 // because we only get/set the default alarm on demand
128 // there's no need to handle conflicts with the settings...
129 // XXX but what happens if we set a (default) alarm, then
130 // the SettingsDB restores?
131 Alarms.getList().refreshFromDataStore(true);
132 }
133 }
134 return super.receiveEvent(e);
135 }
136 }
137}
Note: See TracBrowser for help on using the repository browser.