package net.sabi.pester; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import danger.app.Application; import danger.internal.Date; import danger.util.StdActiveList; import danger.util.StdActiveObject; import danger.util.DEBUG; public class Alarm extends StdActiveObject { private static final int VERSION_1 = 1; // persisted private String mMessage; private int mType; private int mPeriod; // XXX rename to 'interval' private Date mDate; // transient private int mState; private danger.app.Alarm mAlarm; public Alarm() { mState = STATE_INVALID; mAlarm = new danger.app.Alarm(0, Application.getCurrentApp(), this); } public String getMessage() { return mMessage; } public int getPeriod() { return mPeriod; } public boolean getUsesPeriod() { return mType != TYPE_DATE; } public boolean getRepeating() { return mType == TYPE_PERIODIC_REPEATING; } public Date getDate() { return mDate; } public void setMessage(String message) { mMessage = message; } public void setPeriod(int period, boolean repeating) { mType = repeating ? TYPE_PERIODIC_REPEATING : TYPE_PERIODIC; mPeriod = period; mDate = new Date(); mDate.addSeconds(period); } public void setDate(Date date) { mType = TYPE_DATE; mDate = date; } public byte[] toByteArray() { try { ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); DataOutputStream dataStream = new DataOutputStream(byteStream); dataStream.writeByte(VERSION_1); dataStream.writeUTF(mMessage); dataStream.writeInt(mPeriod); dataStream.writeInt(mDate.getUnixTimeGMT()); dataStream.writeInt(mType); dataStream.flush(); return byteStream.toByteArray(); } catch (Exception e) { // XXX do something } return null; } public void fromByteArray(byte[] data) { try { ByteArrayInputStream byteStream = new ByteArrayInputStream(data); DataInputStream dataStream = new DataInputStream(byteStream); byte version = dataStream.readByte(); if (version != VERSION_1) { // XXX barf } mMessage = dataStream.readUTF(); mPeriod = dataStream.readInt(); mType = dataStream.readInt(); } catch (Exception e) { // XXX do something } } void beginEditing() { mState = STATE_EDITING; mAlarm.deactivate(); } void dismiss() { if (getRepeating()) schedule(); else ((StdActiveList)getDelegate()).removeItem(this); } void cancel() { mState = STATE_INVALID; mAlarm.deactivate(); } void schedule() { mState = STATE_SCHEDULED; DEBUG.p("schedule alarm: " + mMessage); switch (mType) { case TYPE_PERIODIC: DEBUG.p(" - periodic: " + mPeriod); break; case TYPE_PERIODIC_REPEATING: DEBUG.p(" - periodic repeating: " + mPeriod); break; case TYPE_DATE: DEBUG.p(" - date: " + mDate); break; } mAlarm.resetWake(mPeriod); } public String toString() { return mMessage; } public static final int TYPE_PERIODIC = 0; public static final int TYPE_PERIODIC_REPEATING = 1; public static final int TYPE_DATE = 2; public static final int STATE_INVALID = 0; public static final int STATE_EDITING = 1; public static final int STATE_SCHEDULED = 2; }