/*
* Copyright (C) 2009 Teleca Poland Sp. z o.o. <android@teleca.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.teleca.jamendo.api_impl;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OptionalDataException;
import java.util.ArrayList;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.teleca.jamendo.activity.playview.PlayMethod;
import com.teleca.jamendo.api.IDatabase;
import com.teleca.jamendo.db.AlbumDatabaseBuilder;
import com.teleca.jamendo.db.RadioDatabaseBuilder;
import com.teleca.jamendo.db.TrackDatabaseBuilder;
import com.teleca.jamendo.model.Album;
import com.teleca.jamendo.model.Playlist;
import com.teleca.jamendo.model.Radio;
import com.teleca.jamendo.model.Track;
/**
* Database implementation using Android SQLite
*
* @author Lukasz Wisniewski
*/
public class DatabaseImpl implements IDatabase {
private static final String DB_NAME = "jamendroid";
private static final String TABLE_PLAYLIST = "playlist";
private static final String TABLE_RECENT_RADIOS = "recent_radios";
private static final String TABLE_FAVORITES = "favorites";
/**
* Serializable Jamendroid Playlist (file extension)
*/
private static final String SJP_EXT = ".sjp";
private Activity mActivity;
public DatabaseImpl(Activity activity){
this.mActivity = activity;
create();
}
/**
* Initializes database and tables
*/
private void create(){
SQLiteDatabase db = mActivity.openOrCreateDatabase(DB_NAME, Context.MODE_PRIVATE, null);
// create tables if necessary
db.execSQL("CREATE TABLE IF NOT EXISTS "
+ TABLE_PLAYLIST
+ " (PlaylistName VARCHAR UNIQUE,"
+ " FileName INTEGER PRIMARY KEY AUTOINCREMENT);");
db.execSQL("CREATE TABLE IF NOT EXISTS "
+ TABLE_RECENT_RADIOS
+ " (radio_id INTEGER UNIQUE, radio_idstr VARCHAR, radio_name VARCHAR, radio_image VARCHAR, radio_date INTEGER);");
db.execSQL("CREATE TABLE IF NOT EXISTS "
+ TABLE_FAVORITES
+ " (track_id INTEGER UNIQUE, track_name VARCHAR,"
+ " track_duration INTEGER, track_url VARCHAR, track_stream VARCHAR, track_rating REAL,"
+ " album_id INTEGER, album_name VARCHAR, album_image VARCHAR, album_rating REAL, artist_name VARCHAR);");
db.close();
}
@Override
public void deletePlaylist(String playlistName) {
SQLiteDatabase db = mActivity.openOrCreateDatabase(DB_NAME, Context.MODE_PRIVATE, null);
String fileName = queryForFileName(playlistName, db);
if(fileName != null)
mActivity.deleteFile(fileName);
//mActivity.openFileOutput(fileName, Context.MODE_PRIVATE).getFD().
String[] whereArgs = {playlistName};
db.delete(TABLE_PLAYLIST, "PlaylistName = ?", whereArgs);
db.close();
}
@Override
public ArrayList<String> getAvailablePlaylists() {
ArrayList<String> playlists = new ArrayList<String>();
SQLiteDatabase db = mActivity.openOrCreateDatabase(DB_NAME, Context.MODE_PRIVATE, null);
String[] columns = {"PlaylistName"};
Cursor query = db.query(TABLE_PLAYLIST, columns, null, null, null, null, "PlaylistName ASC");
if(query != null){
query.moveToFirst();
int columnIndex = query.getColumnIndex("PlaylistName");
while(!query.isAfterLast()){
playlists.add(query.getString(columnIndex));
query.moveToNext();
}
}
query.close();
db.close();
return playlists;
}
@Override
public PlayMethod loadPlaylist(String playlistName) {
if(!getAvailablePlaylists().contains(playlistName))
return null;
PlayMethod playlist = null;
SQLiteDatabase db = mActivity.openOrCreateDatabase(DB_NAME, Context.MODE_PRIVATE, null);
String fileName = queryForFileName(playlistName, db);
try {
FileInputStream fis = mActivity.openFileInput(fileName);
ObjectInputStream in = new ObjectInputStream(fis);
playlist = (PlayMethod)in.readObject();
in.close();
if(playlist == null)
playlist = new PlayMethod();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (OptionalDataException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
db.close();
return playlist;
}
@Override
public void savePlaylist(PlayMethod playlist, String playlistName) {
deletePlaylist(playlistName);
SQLiteDatabase db = mActivity.openOrCreateDatabase(DB_NAME, Context.MODE_PRIVATE, null);
// put playlist reference into the table
ContentValues values = new ContentValues();
values.put("PlaylistName", playlistName);
db.insert(TABLE_PLAYLIST, null, values);
// query for filename
String fileName = queryForFileName(playlistName, db);
// save playlist to file
try {
FileOutputStream fos = mActivity.openFileOutput(fileName, Context.MODE_PRIVATE);
ObjectOutputStream out = new ObjectOutputStream(fos);
out.writeObject(playlist);
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
db.close();
}
@Override
public boolean playlistExists(String playlistName) {
boolean value = false;
SQLiteDatabase db = getDb();
String[] columns = {"PlaylistName"};
String[] selectionArgs = {playlistName};
Cursor query = db.query(TABLE_PLAYLIST, columns, "PlaylistName = ?", selectionArgs, null, null, null);
if(query != null && query.getCount() > 0 ){
value = true;
}
query.close();
db.close();
return value;
}
@Override
public void addRadioToRecent(Radio radio) {
SQLiteDatabase db = getDb();
// put radio data into the table
ContentValues values = new RadioDatabaseBuilder().deconstruct(radio);
String[] whereArgs = {""+radio.getId()};
int row_count = db.update(TABLE_RECENT_RADIOS, values, "radio_id=?", whereArgs);
if(row_count == 0){
db.insert(TABLE_RECENT_RADIOS, null, values);
}
db.close();
}
@Override
public ArrayList<Radio> getRecentRadios(int limit) {
ArrayList<Radio> radios = new ArrayList<Radio>();
SQLiteDatabase db = getDb();
String[] columns = {"radio_id","radio_idstr","radio_name","radio_image"};
Cursor query = db.query(TABLE_RECENT_RADIOS, columns, "", null, null, null, "radio_date DESC", ""+limit);
if(query != null){
query.moveToFirst();
while(!query.isAfterLast()){
Radio radio = new RadioDatabaseBuilder().build(query);
radios.add(radio);
query.moveToNext();
}
}
// TODO probably remove the rest
db.close();
return radios;
}
@Override
public void addToFavorites(Playlist entry) {
SQLiteDatabase db = getDb();
// put playlistentry data the table
ContentValues values = new ContentValues();
values.putAll(new TrackDatabaseBuilder().deconstruct(entry.getTrack()));
values.putAll(new AlbumDatabaseBuilder().deconstruct(entry.getAlbum()));
String[] whereArgs = {""+entry.getTrack().getId()};
int row_count = db.update(TABLE_FAVORITES, values, "track_id=?", whereArgs);
if(row_count == 0){
db.insert(TABLE_FAVORITES, null, values);
}
db.close();
}
@Override
public PlayMethod getFavorites() {
PlayMethod playlist = new PlayMethod();
SQLiteDatabase db = getDb();
// String[] columns = {"track_id","track_name","track_duration","track_stream",
// "track_rating", "album_id", "album_name", "album_image", "album_rating", "artist_name"};
Cursor query = db.query(TABLE_FAVORITES, null, null, null, null, null, null);
if(query != null){
query.moveToFirst();
while(!query.isAfterLast()){
Track track = new TrackDatabaseBuilder().build(query);
Album album = new AlbumDatabaseBuilder().build(query);
Playlist entry = new Playlist();
entry.setAlbum(album);
entry.setTrack(track);
playlist.addPlaylistEntry(entry);
query.moveToNext();
}
}
db.close();
return playlist;
}
@Override
public void removeFromFavorites(Playlist entry) {
SQLiteDatabase db = getDb();
String[] whereArgs = {""+entry.getTrack().getId()};
db.delete(TABLE_FAVORITES, "track_id = ?", whereArgs);
db.close();
}
private String queryForFileName(String playlistName, SQLiteDatabase db){
String fileName = null;
String[] columns = {"FileName"};
String[] selectionArgs = {playlistName};
Cursor query = db.query(TABLE_PLAYLIST, columns, "PlaylistName = ?", selectionArgs, null, null, null);
if(query != null && query.getCount() > 0){
int columnIndex = query.getColumnIndex("FileName");
query.moveToFirst();
int file_id = query.getInt(columnIndex);
fileName = ""+file_id+SJP_EXT;
}
query.close();
return fileName;
}
private SQLiteDatabase getDb(){
return mActivity.openOrCreateDatabase(DB_NAME, Context.MODE_PRIVATE, null);
}
}