package com.architjn.acjmusicplayer.utils.handlers;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteStatement;
import android.provider.MediaStore;
import com.architjn.acjmusicplayer.utils.items.Playlist;
import com.architjn.acjmusicplayer.utils.items.Song;
import java.util.ArrayList;
/**
* Created by architjn on 09/12/15.
*/
public class PlaylistDBHelper extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "PlaylistDB";
private static final String TABLE_PLAYLIST_SONGS = "playlistSongs";
private static final String TABLE_PLAYLIST = "playlist";
private static final String SONG_KEY_ID = "song_id";
private static final String SONG_KEY_REAL_ID = "song_real_id";
private static final String SONG_KEY_PLAYLIST_ID = "song_playlist_id";
private static final String PLAYLIST_KEY_ID = "playlist_id";
private static final String PLAYLIST_KEY_NAME = "playlist_name";
private Context context;
public PlaylistDBHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
this.context = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_PLAYLIST_SONG_TABLE = "CREATE TABLE playlistSongs (" +
"song_id INTEGER PRIMARY KEY AUTOINCREMENT," +
"song_real_id INTEGER," +
"song_playlist_id INTEGER)";
String CREATE_PLAYLIST_TABLE = "CREATE TABLE playlist (" +
"playlist_id INTEGER PRIMARY KEY AUTOINCREMENT," +
"playlist_name TEXT)";
db.execSQL(CREATE_PLAYLIST_SONG_TABLE);
db.execSQL(CREATE_PLAYLIST_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS playlistSongs");
db.execSQL("DROP TABLE IF EXISTS playlist");
this.onCreate(db);
}
public void renamePlaylist(String name, int playlistId) {
String query = "UPDATE " + TABLE_PLAYLIST + " SET " + PLAYLIST_KEY_NAME
+ "='" + name + "' WHERE "
+ PLAYLIST_KEY_ID + "='" + playlistId + "'";
SQLiteDatabase db = this.getWritableDatabase();
db.execSQL(query);
db.close();
}
public void addSong(int song, int playlistId) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.putNull(SONG_KEY_ID);
values.put(SONG_KEY_REAL_ID, song);
values.put(SONG_KEY_PLAYLIST_ID, playlistId);
db.insert(TABLE_PLAYLIST_SONGS, null, values);
db.close();
}
public void addSong(ArrayList<Integer> songs, int playlistId) {
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));
values.put(SONG_KEY_PLAYLIST_ID, playlistId);
db.insert(TABLE_PLAYLIST_SONGS, null, values);
}
db.close();
}
public ArrayList<Playlist> getAllPlaylist() {
String query = "SELECT * FROM " + TABLE_PLAYLIST;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(query, null);
ArrayList<Playlist> playlist = new ArrayList<>();
if (cursor.moveToFirst()) {
do {
playlist.add(getPlaylistFromCursor(cursor));
} while (cursor.moveToNext());
}
db.close();
return playlist;
}
private Playlist getPlaylistFromCursor(Cursor cursor) {
int playlistId = Integer.parseInt(cursor.getString(0));
return new Playlist(playlistId, cursor.getString(1),
getPlaylistSongCount(playlistId));
}
public void removeSong(int songId, int playlistId) {
SQLiteDatabase db = this.getWritableDatabase();
db.execSQL("DELETE FROM " + TABLE_PLAYLIST_SONGS + " WHERE " +
SONG_KEY_REAL_ID + "='" + songId + "' AND "
+ SONG_KEY_PLAYLIST_ID + "='" + playlistId + "'");
db.close();
}
public void deletePlaylist(int playlistId) {
SQLiteDatabase db = this.getWritableDatabase();
db.execSQL("DELETE FROM " + TABLE_PLAYLIST + " WHERE " +
PLAYLIST_KEY_ID + "='" + playlistId + "'");
db.execSQL("DELETE FROM " + TABLE_PLAYLIST_SONGS + " WHERE " +
SONG_KEY_PLAYLIST_ID + "='" + playlistId + "'");
db.close();
}
public void createPlaylist(String name) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.putNull(PLAYLIST_KEY_ID);
values.put(PLAYLIST_KEY_NAME, name);
db.insert(TABLE_PLAYLIST, null, values);
db.close();
}
public ArrayList<Song> getAllPlaylistSongs(int playlistId) {
SQLiteDatabase db = this.getWritableDatabase();
ArrayList<Integer> songsIds = getAllPlaylistSongsIds(db, playlistId);
ArrayList<Song> songList = new ArrayList<>();
System.gc();
for (int i = 0; i < songsIds.size(); i++) {
final String where = MediaStore.Audio.Media.IS_MUSIC + "=1 AND " +
MediaStore.Audio.Media._ID + "=" + songsIds.get(i).toString();
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.DATE_ADDED);
do {
songList.add(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)));
}
while (musicCursor.moveToNext());
}
if (musicCursor != null)
musicCursor.close();
}
db.close();
return songList;
}
private ArrayList<Integer> getAllPlaylistSongsIds(SQLiteDatabase db, int playlistId) {
String query = "SELECT * FROM " + TABLE_PLAYLIST_SONGS + " WHERE "
+ SONG_KEY_PLAYLIST_ID + "='" + playlistId + "'";
Cursor cursor = db.rawQuery(query, null);
ArrayList<Integer> songsId = new ArrayList<>();
if (cursor.moveToFirst()) {
do {
songsId.add(Integer.parseInt(cursor.getString(1)));
} while (cursor.moveToNext());
}
return songsId;
}
public long getPlaylistSongCount(int playlistId) {
String query = "select count(*) from " + TABLE_PLAYLIST_SONGS + " where "
+ SONG_KEY_PLAYLIST_ID + "='" + playlistId + "'";
SQLiteDatabase db = this.getWritableDatabase();
SQLiteStatement s = db.compileStatement(query);
long count = s.simpleQueryForLong();
db.close();
return count;
}
}