package com.wigwamlabs.veckify.db;
import android.os.Parcel;
import android.os.Parcelable;
import com.commonsware.cwac.loaderex.SQLiteCursorLoader;
import com.wigwamlabs.utils.db.DatabaseEntry;
import com.wigwamlabs.veckify.AlarmUtils;
import com.wigwamlabs.veckify.Debug;
import java.util.Calendar;
public class AlarmEntry extends DatabaseEntry {
public static final Parcelable.Creator CREATOR =
new Parcelable.Creator() {
@Override
public AlarmEntry createFromParcel(Parcel in) {
return new AlarmEntry(in);
}
@Override
public AlarmEntry[] newArray(int size) {
return new AlarmEntry[size];
}
};
private boolean mHasPlaylist;
public AlarmEntry() {
super(AlarmTable.n);
}
public AlarmEntry(Parcel in) {
super(AlarmTable.n, in);
mHasPlaylist = in.readInt() > 0;
}
public static AlarmEntry createNew() {
final AlarmEntry entry = new AlarmEntry();
entry.setDeleted(false);
entry.setEnabled(false);
entry.setRepeatDays(AlarmUtils.DAYS_NONE);
entry.setVolume(100);
entry.setShuffle(true);
entry.setTellTime(true);
return entry;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeInt(mHasPlaylist ? 1 : 0);
}
@Override
public void clear() {
super.clear();
mHasPlaylist = false;
}
public void setDeleted(boolean deleted) {
mValues.put(AlarmTable.deleted, deleted);
}
public boolean isEnabled() {
return mValues.getAsBoolean(AlarmTable.enabled).booleanValue();
}
public void setEnabled(boolean enabled) {
mValues.put(AlarmTable.enabled, enabled);
}
public void setTime(int hour, int minute) {
mValues.put(AlarmTable.time, hour * 100 + minute);
}
public Integer getTime() {
return mValues.getAsInteger(AlarmTable.time);
}
public void setTime(Integer time) {
mValues.put(AlarmTable.time, time);
}
public int getHour() {
return mValues.getAsInteger(AlarmTable.time).intValue() / 100;
}
public int getMinute() {
return mValues.getAsInteger(AlarmTable.time).intValue() % 100;
}
public int getRepeatDays() {
return mValues.getAsInteger(AlarmTable.repeatdays).intValue();
}
public void setRepeatDays(int repeatDays) {
mValues.put(AlarmTable.repeatdays, repeatDays);
}
public void setOneoffTimeMs(long oneoffTimeMs) {
mValues.put(AlarmTable.oneofftime_ms, oneoffTimeMs);
}
public void setHasPlaylist(boolean hasPlaylist) {
// don't store it in the values... it's enough to know that we have a playlist
mHasPlaylist = hasPlaylist;
}
public boolean hasPlaylist() {
return mHasPlaylist || mValues.getAsString(AlarmTable.playlistlink) != null;
}
public void setPlaylistName(String playlistName) {
mValues.put(AlarmTable.playlistname, playlistName);
}
public void setPlaylistLink(String playlistLink) {
mValues.put(AlarmTable.playlistlink, playlistLink);
}
public Integer getVolume() {
return mValues.getAsInteger(AlarmTable.volume);
}
public void setVolume(Integer volume) {
mValues.put(AlarmTable.volume, volume);
}
public void setShuffle(boolean shuffle) {
mValues.put(AlarmTable.shuffle, shuffle);
}
public boolean getTellTime() {
return mValues.getAsBoolean(AlarmTable.telltime).booleanValue();
}
public void setTellTime(boolean tellTime) {
mValues.put(AlarmTable.telltime, tellTime);
}
@Override
public void update(SQLiteCursorLoader loader, long id) {
updateBeforeSaving(System.currentTimeMillis());
super.update(loader, id);
}
void updateBeforeSaving(long nowMs) {
final Boolean enabled = mValues.getAsBoolean(AlarmTable.enabled);
if (enabled == null) {
throw new RuntimeException("Didn't set value 'enabled'");
}
final Integer time = mValues.getAsInteger(AlarmTable.time);
if (!mValues.containsKey(AlarmTable.time)) {
throw new RuntimeException("Didn't set value 'time'");
}
final Integer repeatDays = mValues.getAsInteger(AlarmTable.repeatdays);
if (repeatDays == null) {
throw new RuntimeException("Didn't set value 'repeatdays'");
}
if (time != null && repeatDays.intValue() == AlarmUtils.DAYS_NONE) {
final int hour = time.intValue() / 100;
final int minute = time.intValue() % 100;
final Calendar nextAlarmTime = AlarmUtils.getNextAlarmTime(enabled.booleanValue(), hour, minute, repeatDays.intValue(), 0, nowMs);
setOneoffTimeMs(nextAlarmTime == null ? 0 : nextAlarmTime.getTimeInMillis());
}
}
public void updateExpiredOneoffAlarms(DataDatabaseAdapter db) {
final String where = String.format("%s = %d AND %s < %d", AlarmTable.repeatdays, AlarmUtils.DAYS_NONE, AlarmTable.oneofftime_ms, System.currentTimeMillis());
final int updated = db.getWritableDatabase().update(AlarmTable.n, mValues, where, null);
Debug.logSql("UPDATE " + AlarmTable.n + " VALUES " + mValues + " WHERE " + where + " => affected " + updated + " rows");
}
}