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
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;
[244]8import danger.audio.RingToneObject;
[237]9import danger.internal.Date;
[243]10import danger.util.LocaleUtils;
[242]11import danger.util.StdActiveList;
[237]12import danger.util.StdActiveObject;
[240]13import danger.util.DEBUG;
[243]14import danger.util.format.DateFormat;
15import danger.util.format.StringFormat;
[237]16
17public class Alarm extends StdActiveObject {
18 private static final int VERSION_1 = 1;
19
20 // persisted
21 private String mMessage;
[239]22 private int mType;
[240]23 private int mPeriod; // XXX rename to 'interval'
[237]24 private Date mDate;
[244]25 private RingToneObject mAlert;
[237]26
27 // transient
[241]28 private int mState;
[242]29 private danger.app.Alarm mAlarm;
[237]30
31 public Alarm() {
[241]32 mState = STATE_INVALID;
[242]33 mAlarm = new danger.app.Alarm(0, Application.getCurrentApp(), this);
[237]34 }
35
36 public String getMessage() {
37 return mMessage;
38 }
[240]39 public int getPeriod() {
[237]40 return mPeriod;
41 }
42 public boolean getUsesPeriod() {
[239]43 return mType != TYPE_DATE;
[237]44 }
[240]45 public boolean getRepeating() {
46 return mType == TYPE_PERIODIC_REPEATING;
47 }
[237]48 public Date getDate() {
49 return mDate;
50 }
[244]51 public RingToneObject getAlert() {
52 return mAlert;
53 }
[237]54
55 public void setMessage(String message) {
56 mMessage = message;
57 }
[240]58 public void setPeriod(int period, boolean repeating) {
[239]59 mType = repeating ? TYPE_PERIODIC_REPEATING : TYPE_PERIODIC;
[237]60 mPeriod = period;
61 }
62 public void setDate(Date date) {
[239]63 mType = TYPE_DATE;
[237]64 mDate = date;
65 }
[244]66 public void setAlert(RingToneObject alert) {
67 mAlert = alert.isValid() ? alert : null;
68 }
[237]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);
[240]77 dataStream.writeInt(mPeriod);
[237]78 dataStream.writeInt(mDate.getUnixTimeGMT());
[239]79 dataStream.writeInt(mType);
[237]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();
[240]98 mPeriod = dataStream.readInt();
[239]99 mType = dataStream.readInt();
[237]100 } catch (Exception e) {
101 // XXX do something
102 }
103 }
104
105 void beginEditing() {
[241]106 mState = STATE_EDITING;
[242]107 mAlarm.deactivate();
[237]108 }
109
[243]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
[242]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
[243]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 }
[240]146 switch (mType) {
147 case TYPE_PERIODIC:
[243]148 sb.append("periodic (").append(mPeriod).append("s) "); break;
[240]149 case TYPE_PERIODIC_REPEATING:
[243]150 sb.append("repeating periodic (").append(mPeriod).append("s) ");
151 break;
[240]152 case TYPE_DATE:
[243]153 sb.append("date (").append(getDateTimeString()).append(") "); break;
[240]154 }
[243]155 sb.append("alarm: ");
156 sb.append('"').append(mMessage).append('"');
157 return sb.toString();
[237]158 }
[243]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();
[247]165 String dateFormat = LocaleUtils.getMediumDateFormat();
[243]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
[237]175 public String toString() {
176 return mMessage;
177 }
178
[239]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
[241]183 public static final int STATE_INVALID = 0;
184 public static final int STATE_EDITING = 1;
185 public static final int STATE_SCHEDULED = 2;
[237]186}
Note: See TracBrowser for help on using the repository browser.