source: trunk/hiptop/pester/net/sabi/pester/Alarm.java@ 247

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

Launch on boot; better date format; PNG optimization

File size: 4.7 KB
Line 
1package net.sabi.pester;
2
3import java.io.ByteArrayInputStream;
4import java.io.ByteArrayOutputStream;
5import java.io.DataInputStream;
6import java.io.DataOutputStream;
7import danger.app.Application;
8import danger.audio.RingToneObject;
9import danger.internal.Date;
10import danger.util.LocaleUtils;
11import danger.util.StdActiveList;
12import danger.util.StdActiveObject;
13import danger.util.DEBUG;
14import danger.util.format.DateFormat;
15import danger.util.format.StringFormat;
16
17public class Alarm extends StdActiveObject {
18 private static final int VERSION_1 = 1;
19
20 // persisted
21 private String mMessage;
22 private int mType;
23 private int mPeriod; // XXX rename to 'interval'
24 private Date mDate;
25 private RingToneObject mAlert;
26
27 // transient
28 private int mState;
29 private danger.app.Alarm mAlarm;
30
31 public Alarm() {
32 mState = STATE_INVALID;
33 mAlarm = new danger.app.Alarm(0, Application.getCurrentApp(), this);
34 }
35
36 public String getMessage() {
37 return mMessage;
38 }
39 public int getPeriod() {
40 return mPeriod;
41 }
42 public boolean getUsesPeriod() {
43 return mType != TYPE_DATE;
44 }
45 public boolean getRepeating() {
46 return mType == TYPE_PERIODIC_REPEATING;
47 }
48 public Date getDate() {
49 return mDate;
50 }
51 public RingToneObject getAlert() {
52 return mAlert;
53 }
54
55 public void setMessage(String message) {
56 mMessage = message;
57 }
58 public void setPeriod(int period, boolean repeating) {
59 mType = repeating ? TYPE_PERIODIC_REPEATING : TYPE_PERIODIC;
60 mPeriod = period;
61 }
62 public void setDate(Date date) {
63 mType = TYPE_DATE;
64 mDate = date;
65 }
66 public void setAlert(RingToneObject alert) {
67 mAlert = alert.isValid() ? alert : null;
68 }
69
70 public byte[] toByteArray() {
71 try {
72 ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
73 DataOutputStream dataStream = new DataOutputStream(byteStream);
74
75 dataStream.writeByte(VERSION_1);
76 dataStream.writeUTF(mMessage);
77 dataStream.writeInt(mPeriod);
78 dataStream.writeInt(mDate.getUnixTimeGMT());
79 dataStream.writeInt(mType);
80 dataStream.flush();
81 return byteStream.toByteArray();
82 } catch (Exception e) {
83 // XXX do something
84 }
85 return null;
86 }
87
88 public void fromByteArray(byte[] data) {
89 try {
90 ByteArrayInputStream byteStream = new ByteArrayInputStream(data);
91 DataInputStream dataStream = new DataInputStream(byteStream);
92
93 byte version = dataStream.readByte();
94 if (version != VERSION_1) {
95 // XXX barf
96 }
97 mMessage = dataStream.readUTF();
98 mPeriod = dataStream.readInt();
99 mType = dataStream.readInt();
100 } catch (Exception e) {
101 // XXX do something
102 }
103 }
104
105 void beginEditing() {
106 mState = STATE_EDITING;
107 mAlarm.deactivate();
108 }
109
110 void resume() {
111 mState = STATE_SCHEDULED;
112 int period = mDate.getDangerTimeGMT() - new Date().getDangerTimeGMT();
113 if (period < 0) period = 0;
114 mAlarm.resetWake(period);
115 DEBUG.p("resetWake: " + description() + " - " + period + "s left");
116 update();
117 }
118
119 void schedule() {
120 if (getUsesPeriod()) {
121 mDate = new Date();
122 mDate.addSeconds(mPeriod);
123 }
124 resume();
125 }
126
127 void dismiss() {
128 if (getRepeating())
129 schedule();
130 else
131 ((StdActiveList)getDelegate()).removeItem(this);
132 }
133
134 void cancel() {
135 mState = STATE_INVALID;
136 mAlarm.deactivate();
137 }
138
139 public String description() {
140 StringBuffer sb = new StringBuffer();
141 switch (mState) {
142 case STATE_INVALID: sb.append("invalid "); break;
143 case STATE_EDITING: sb.append("editing "); break;
144 case STATE_SCHEDULED: sb.append("scheduled "); break;
145 }
146 switch (mType) {
147 case TYPE_PERIODIC:
148 sb.append("periodic (").append(mPeriod).append("s) "); break;
149 case TYPE_PERIODIC_REPEATING:
150 sb.append("repeating periodic (").append(mPeriod).append("s) ");
151 break;
152 case TYPE_DATE:
153 sb.append("date (").append(getDateTimeString()).append(") "); break;
154 }
155 sb.append("alarm: ");
156 sb.append('"').append(mMessage).append('"');
157 return sb.toString();
158 }
159
160 protected static String dateTimeString(Date date) {
161 if (date == null)
162 return null;
163 String layout = LocaleUtils.getDateTimePattern();
164 String timeFormat = LocaleUtils.getMediumTimeFormat();
165 String dateFormat = LocaleUtils.getMediumDateFormat();
166 return StringFormat.withFormat(layout,
167 DateFormat.withFormat(timeFormat, date),
168 DateFormat.withFormat(dateFormat, date));
169 }
170
171 public String getDateTimeString() {
172 return dateTimeString(mDate);
173 }
174
175 public String toString() {
176 return mMessage;
177 }
178
179 public static final int TYPE_PERIODIC = 0;
180 public static final int TYPE_PERIODIC_REPEATING = 1;
181 public static final int TYPE_DATE = 2;
182
183 public static final int STATE_INVALID = 0;
184 public static final int STATE_EDITING = 1;
185 public static final int STATE_SCHEDULED = 2;
186}
Note: See TracBrowser for help on using the repository browser.