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

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

Bug fixing and cleanups.

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