[237] | 1 | package net.sabi.pester;
|
---|
| 2 |
|
---|
| 3 | import java.io.ByteArrayInputStream;
|
---|
| 4 | import java.io.ByteArrayOutputStream;
|
---|
| 5 | import java.io.DataInputStream;
|
---|
| 6 | import java.io.DataOutputStream;
|
---|
[242] | 7 | import danger.app.Application;
|
---|
[237] | 8 | import danger.internal.Date;
|
---|
[242] | 9 | import danger.util.StdActiveList;
|
---|
[237] | 10 | import danger.util.StdActiveObject;
|
---|
[240] | 11 | import danger.util.DEBUG;
|
---|
[237] | 12 |
|
---|
| 13 | public class Alarm extends StdActiveObject {
|
---|
| 14 | private static final int VERSION_1 = 1;
|
---|
| 15 |
|
---|
| 16 | // persisted
|
---|
| 17 | private String mMessage;
|
---|
[239] | 18 | private int mType;
|
---|
[240] | 19 | private int mPeriod; // XXX rename to 'interval'
|
---|
[237] | 20 | private Date mDate;
|
---|
| 21 |
|
---|
| 22 | // transient
|
---|
[241] | 23 | private int mState;
|
---|
[242] | 24 | private danger.app.Alarm mAlarm;
|
---|
[237] | 25 |
|
---|
| 26 | public Alarm() {
|
---|
[241] | 27 | mState = STATE_INVALID;
|
---|
[242] | 28 | mAlarm = new danger.app.Alarm(0, Application.getCurrentApp(), this);
|
---|
[237] | 29 | }
|
---|
| 30 |
|
---|
| 31 | public String getMessage() {
|
---|
| 32 | return mMessage;
|
---|
| 33 | }
|
---|
[240] | 34 | public int getPeriod() {
|
---|
[237] | 35 | return mPeriod;
|
---|
| 36 | }
|
---|
| 37 | public boolean getUsesPeriod() {
|
---|
[239] | 38 | return mType != TYPE_DATE;
|
---|
[237] | 39 | }
|
---|
[240] | 40 | public boolean getRepeating() {
|
---|
| 41 | return mType == TYPE_PERIODIC_REPEATING;
|
---|
| 42 | }
|
---|
[237] | 43 | public Date getDate() {
|
---|
| 44 | return mDate;
|
---|
| 45 | }
|
---|
| 46 |
|
---|
| 47 | public void setMessage(String message) {
|
---|
| 48 | mMessage = message;
|
---|
| 49 | }
|
---|
[240] | 50 | public void setPeriod(int period, boolean repeating) {
|
---|
[239] | 51 | mType = repeating ? TYPE_PERIODIC_REPEATING : TYPE_PERIODIC;
|
---|
[237] | 52 | mPeriod = period;
|
---|
[240] | 53 | mDate = new Date();
|
---|
| 54 | mDate.addSeconds(period);
|
---|
[237] | 55 | }
|
---|
| 56 | public void setDate(Date date) {
|
---|
[239] | 57 | mType = TYPE_DATE;
|
---|
[237] | 58 | mDate = date;
|
---|
| 59 | }
|
---|
| 60 |
|
---|
| 61 | public byte[] toByteArray() {
|
---|
| 62 | try {
|
---|
| 63 | ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
|
---|
| 64 | DataOutputStream dataStream = new DataOutputStream(byteStream);
|
---|
| 65 |
|
---|
| 66 | dataStream.writeByte(VERSION_1);
|
---|
| 67 | dataStream.writeUTF(mMessage);
|
---|
[240] | 68 | dataStream.writeInt(mPeriod);
|
---|
[237] | 69 | dataStream.writeInt(mDate.getUnixTimeGMT());
|
---|
[239] | 70 | dataStream.writeInt(mType);
|
---|
[237] | 71 | dataStream.flush();
|
---|
| 72 | return byteStream.toByteArray();
|
---|
| 73 | } catch (Exception e) {
|
---|
| 74 | // XXX do something
|
---|
| 75 | }
|
---|
| 76 | return null;
|
---|
| 77 | }
|
---|
| 78 |
|
---|
| 79 | public void fromByteArray(byte[] data) {
|
---|
| 80 | try {
|
---|
| 81 | ByteArrayInputStream byteStream = new ByteArrayInputStream(data);
|
---|
| 82 | DataInputStream dataStream = new DataInputStream(byteStream);
|
---|
| 83 |
|
---|
| 84 | byte version = dataStream.readByte();
|
---|
| 85 | if (version != VERSION_1) {
|
---|
| 86 | // XXX barf
|
---|
| 87 | }
|
---|
| 88 | mMessage = dataStream.readUTF();
|
---|
[240] | 89 | mPeriod = dataStream.readInt();
|
---|
[239] | 90 | mType = dataStream.readInt();
|
---|
[237] | 91 | } catch (Exception e) {
|
---|
| 92 | // XXX do something
|
---|
| 93 | }
|
---|
| 94 | }
|
---|
| 95 |
|
---|
| 96 | void beginEditing() {
|
---|
[241] | 97 | mState = STATE_EDITING;
|
---|
[242] | 98 | mAlarm.deactivate();
|
---|
[237] | 99 | }
|
---|
| 100 |
|
---|
[242] | 101 | void dismiss() {
|
---|
| 102 | if (getRepeating())
|
---|
| 103 | schedule();
|
---|
| 104 | else
|
---|
| 105 | ((StdActiveList)getDelegate()).removeItem(this);
|
---|
| 106 | }
|
---|
| 107 |
|
---|
| 108 | void cancel() {
|
---|
| 109 | mState = STATE_INVALID;
|
---|
| 110 | mAlarm.deactivate();
|
---|
| 111 | }
|
---|
| 112 |
|
---|
| 113 | void schedule() {
|
---|
[241] | 114 | mState = STATE_SCHEDULED;
|
---|
[240] | 115 | DEBUG.p("schedule alarm: " + mMessage);
|
---|
| 116 | switch (mType) {
|
---|
| 117 | case TYPE_PERIODIC:
|
---|
| 118 | DEBUG.p(" - periodic: " + mPeriod); break;
|
---|
| 119 | case TYPE_PERIODIC_REPEATING:
|
---|
| 120 | DEBUG.p(" - periodic repeating: " + mPeriod); break;
|
---|
| 121 | case TYPE_DATE:
|
---|
| 122 | DEBUG.p(" - date: " + mDate); break;
|
---|
| 123 | }
|
---|
[242] | 124 | mAlarm.resetWake(mPeriod);
|
---|
[237] | 125 | }
|
---|
| 126 |
|
---|
| 127 | public String toString() {
|
---|
| 128 | return mMessage;
|
---|
| 129 | }
|
---|
| 130 |
|
---|
[239] | 131 | public static final int TYPE_PERIODIC = 0;
|
---|
| 132 | public static final int TYPE_PERIODIC_REPEATING = 1;
|
---|
| 133 | public static final int TYPE_DATE = 2;
|
---|
| 134 |
|
---|
[241] | 135 | public static final int STATE_INVALID = 0;
|
---|
| 136 | public static final int STATE_EDITING = 1;
|
---|
| 137 | public static final int STATE_SCHEDULED = 2;
|
---|
[237] | 138 | } |
---|