package com.architjn.acjmusicplayer.utils.handlers;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteCantOpenDatabaseException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.afollestad.async.Action;
import com.architjn.acjmusicplayer.utils.ListSongs;
import com.architjn.acjmusicplayer.utils.items.Song;
import java.util.ArrayList;
/**
* Created by architjn on 11/12/15.
*/
public class PlayerDBHandler extends SQLiteOpenHelper {
public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "PlaybackDB";
public static final String TABLE_PLAYBACK = "songs";
public static final String SONG_KEY_ID = "song_id";
public static final String SONG_KEY_REAL_ID = "song_real_id";
public static final String SONG_KEY_LAST_PLAYED = "song_last_played";
private Context context;
private int fetchedPlayingPos = -1;
public PlayerDBHandler(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
this.context = context;
}
public Song getSongFromId(long id) {
System.gc();
final String where = MediaStore.Audio.Media._ID + "=" + id;
Cursor musicCursor = context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
null, where, null, null);
if (musicCursor != null && musicCursor.moveToFirst()) {
int titleColumn = musicCursor.getColumnIndex
(android.provider.MediaStore.Audio.Media.TITLE);
int idColumn = musicCursor.getColumnIndex
(android.provider.MediaStore.Audio.Media._ID);
int artistColumn = musicCursor.getColumnIndex
(android.provider.MediaStore.Audio.Media.ARTIST);
int pathColumn = musicCursor.getColumnIndex
(MediaStore.Audio.Media.DATA);
int albumIdColumn = musicCursor.getColumnIndex
(MediaStore.Audio.Media.ALBUM_ID);
int albumColumn = musicCursor.getColumnIndex
(MediaStore.Audio.Media.ALBUM);
int addedDateColumn = musicCursor.getColumnIndex
(MediaStore.Audio.Media.DATE_ADDED);
int songDurationColumn = musicCursor.getColumnIndex
(MediaStore.Audio.Media.DURATION);
return new Song(musicCursor.getLong(idColumn),
musicCursor.getString(titleColumn),
musicCursor.getString(artistColumn),
musicCursor.getString(pathColumn), false,
musicCursor.getLong(albumIdColumn),
musicCursor.getString(albumColumn),
musicCursor.getLong(addedDateColumn),
musicCursor.getLong(songDurationColumn));
}
return null;
}
public String setAlbumArt(long albumId) {
Cursor cursor = context.getContentResolver().query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,
new String[]{MediaStore.Audio.Albums._ID, MediaStore.Audio.Albums.ALBUM_ART},
MediaStore.Audio.Albums._ID + "=?",
new String[]{String.valueOf(albumId)},
null);
if (cursor != null && cursor.moveToFirst()) {
return cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ART));
}
return null;
}
@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_PLAYBACK_SONG_TABLE = "CREATE TABLE " + TABLE_PLAYBACK + " (" +
SONG_KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
SONG_KEY_REAL_ID + " INTEGER," +
SONG_KEY_LAST_PLAYED + " INTEGER)";
db.execSQL(CREATE_PLAYBACK_SONG_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int i, int i1) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_PLAYBACK);
}
public void changePlaybackList(final ArrayList<Song> songs, final int currentPlaying) {
final SQLiteDatabase db = this.getWritableDatabase();
new Action<String>() {
@NonNull
@Override
public String id() {
return null;
}
@Nullable
@Override
protected String run() throws InterruptedException {
clearList(db);
for (int i = 0; i < songs.size(); i++) {
ContentValues values = new ContentValues();
values.putNull(PlayerDBHandler.SONG_KEY_ID);
values.put(PlayerDBHandler.SONG_KEY_REAL_ID, songs.get(i).getSongId());
if (i == currentPlaying)
values.put(PlayerDBHandler.SONG_KEY_LAST_PLAYED, true);
else
values.put(PlayerDBHandler.SONG_KEY_LAST_PLAYED, false);
db.insert(PlayerDBHandler.TABLE_PLAYBACK, null, values);
}
return null;
}
}.execute();
//new AddToPlayingList(this.getWritableDatabase(), songs, currentPlaying).execute();
// clearList();
// final SQLiteDatabase db = this.getWritableDatabase();
// for (int i = 0; i < songs.size(); i++) {
// ContentValues values = new ContentValues();
// values.putNull(SONG_KEY_ID);
// values.put(SONG_KEY_REAL_ID, songs.get(i).getSongId());
// if (i == currentPlaying)
// values.put(SONG_KEY_LAST_PLAYED, true);
// else
// values.put(SONG_KEY_LAST_PLAYED, false);
//
// db.insert(TABLE_PLAYBACK, null, values);
// }
// db.close();
}
public ArrayList<Song> getAllPlaybackSongs() {
SQLiteDatabase db = this.getWritableDatabase();
String query = "SELECT * FROM " + TABLE_PLAYBACK;
Cursor cursor = db.rawQuery(query, null);
ArrayList<Song> playbackSongs = new ArrayList<>();
if (cursor.moveToFirst()) {
int counter = 0;
do {
playbackSongs.add(ListSongs.getSong(context, cursor.getInt(1)));
if (cursor.getInt(2) == 1)
fetchedPlayingPos = counter;
counter++;
} while (cursor.moveToNext());
}
//db.close();
return playbackSongs;
}
public int getFetchedPlayingPos() {
return fetchedPlayingPos;
}
public void addSong(Song song) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.putNull(SONG_KEY_ID);
values.put(SONG_KEY_REAL_ID, song.getSongId());
values.put(SONG_KEY_LAST_PLAYED, false);
db.insert(TABLE_PLAYBACK, null, values);
//db.close();
}
public void updatePlayingPosition(long songId) {
SQLiteDatabase db = this.getWritableDatabase();
db.execSQL("UPDATE " + TABLE_PLAYBACK + " SET " + SONG_KEY_LAST_PLAYED + "='0' WHERE " + SONG_KEY_LAST_PLAYED + "='1'");
db.execSQL("UPDATE " + TABLE_PLAYBACK + " SET " + SONG_KEY_LAST_PLAYED + "='1' WHERE "
+ SONG_KEY_REAL_ID + "='" + songId + "'");
//db.close();
}
private void clearList(SQLiteDatabase db) {
try {
db.execSQL("DELETE FROM " + TABLE_PLAYBACK);
//db.close();
} catch (SQLiteCantOpenDatabaseException e) {
e.printStackTrace();
}
}
}