package com.wigwamlabs.veckify.db;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteCursor;
import android.database.sqlite.SQLiteCursorDriver;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQuery;
import android.database.sqlite.SQLiteQueryBuilder;
import android.util.Pair;
import com.commonsware.cwac.loaderex.SQLiteCursorLoader;
import com.wigwamlabs.spotify.PendingPlayPlaylistAction;
import com.wigwamlabs.spotify.SpotifyService;
import com.wigwamlabs.veckify.AlarmUtils;
import com.wigwamlabs.veckify.Debug;
import com.wigwamlabs.veckify.NowPlayingActivity;
public class AlarmsCursor extends SQLiteCursor {
private static final SQLiteDatabase.CursorFactory FACTORY;
static {
FACTORY = new SQLiteDatabase.CursorFactory() {
@Override
public Cursor newCursor(SQLiteDatabase db, SQLiteCursorDriver masterQuery, String editTable, SQLiteQuery query) {
return new AlarmsCursor(masterQuery, editTable, query);
}
};
}
private static final String[] COLUMNS = {
AlarmTable._id,
AlarmTable.enabled,
AlarmTable.time,
AlarmTable.repeatdays,
AlarmTable.oneofftime_ms,
AlarmTable.playlistname,
AlarmTable.playlistlink,
AlarmTable.volume,
AlarmTable.shuffle,
AlarmTable.telltime,
};
private static final int _id_index = 0;
private static final int enabled_index = 1;
private static final int time_index = 2;
private static final int repeatdays_index = 3;
private static final int oneofftime_ms_index = 4;
private static final int playlistname_index = 5;
private static final int playlistlink_index = 6;
private static final int volume_index = 7;
private static final int shuffle_index = 8;
private static final int telltime_index = 9;
private static final String QUERY_SELECT_ALL = SQLiteQueryBuilder.buildQueryString(false, AlarmTable.n, COLUMNS, AlarmTable.deleted + "=0", null, null, null, null);
public AlarmsCursor(SQLiteCursorDriver masterQuery, String editTable, SQLiteQuery query) {
super(masterQuery, editTable, query);
}
public static SQLiteCursorLoader getAllAlarmsLoader(Context context, DataDatabaseAdapter db) {
return new SQLiteCursorLoader(context, db, FACTORY, QUERY_SELECT_ALL, null);
}
public static AlarmsCursor getAllAlarmsCursor(DataDatabaseAdapter db) {
Debug.logSql(QUERY_SELECT_ALL);
return (AlarmsCursor) db.getReadableDatabase().rawQueryWithFactory(FACTORY, QUERY_SELECT_ALL, null, null);
}
public static AlarmsCursor getAlarmCursor(DataDatabaseAdapter db, long alarmId) {
final String query = SQLiteQueryBuilder.buildQueryString(false, AlarmTable.n, COLUMNS, AlarmTable._id + " = " + alarmId, null, null, null, "1");
Debug.logSql(query);
return (AlarmsCursor) db.getReadableDatabase().rawQueryWithFactory(FACTORY, query, null, null);
}
public long _id() {
return getLong(_id_index);
}
public boolean enabled() {
final boolean enabled = getInt(enabled_index) > 0;
if (enabled && repeatDays() == AlarmUtils.DAYS_NONE) { // one-off
final long oneoffTime = oneoffTimeMs();
if (oneoffTime > 0 && oneoffTime < System.currentTimeMillis()) {
Debug.logAlarmScheduling("Alarm " + _id() + " out of synch (one-off event which has expired)");
// db out of sync, should be fixed soon
return false;
}
}
return enabled;
}
public Integer time() {
if (isNull(time_index)) {
return null;
}
return getInt(time_index);
}
public int hour() {
return getInt(time_index) / 100;
}
public int minute() {
return getInt(time_index) % 100;
}
public int repeatDays() {
return getInt(repeatdays_index);
}
public long oneoffTimeMs() {
return getLong(oneofftime_ms_index);
}
public String playlistName() {
return getString(playlistname_index);
}
public String playlistLink() {
return getString(playlistlink_index);
}
public Integer volume() {
if (isNull(volume_index)) {
return null;
}
return getInt(volume_index);
}
public boolean shuffle() {
return getInt(shuffle_index) > 0;
}
public boolean tellTime() {
return getInt(telltime_index) > 0;
}
public Pair<Intent, Intent> createIntents(Context context) {
// setup intent to launch now playing
final Intent nowPlayingIntent = new Intent(context, NowPlayingActivity.class);
nowPlayingIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// launch now playing in alarm mode
nowPlayingIntent.setAction(NowPlayingActivity.ACTION_ALARM);
nowPlayingIntent.putExtra(NowPlayingActivity.EXTRA_ALARM_NAME, playlistName());
// tell service to start playing
final Intent intent = new Intent(context, SpotifyService.class);
intent.setAction(SpotifyService.ACTION_PLAY_PLAYLIST);
final PendingPlayPlaylistAction pendingAction = new PendingPlayPlaylistAction(playlistLink(), PendingIntent.getActivity(context, 0, nowPlayingIntent, 0), volume(), shuffle(), tellTime());
intent.putExtra(SpotifyService.EXTRA_ACTION, pendingAction);
return Pair.create(intent, nowPlayingIntent);
}
}