/*
* Copyright (C) 2012 Andrew Neal 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.andrew.apollo.provider;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* This class is used to create the database used to make the Favorites
* playlist.
*
* @author Andrew Neal (andrewdneal@gmail.com)
*/
public class FavoritesStore extends SQLiteOpenHelper {
/* Version constant to increment when the database should be rebuilt */
private static final int VERSION = 1;
/* Name of database file */
public static final String DATABASENAME = "favorites.db";
private static FavoritesStore sInstance = null;
/**
* Constructor of <code>FavoritesStore</code>
*
* @param context The {@link Context} to use
*/
public FavoritesStore(final Context context) {
super(context, DATABASENAME, null, VERSION);
}
/**
* {@inheritDoc}
*/
@Override
public void onCreate(final SQLiteDatabase db) {
db.execSQL("CREATE TABLE IF NOT EXISTS " + FavoriteColumns.NAME + " (" + FavoriteColumns.ID
+ " LONG NOT NULL," + FavoriteColumns.SONGNAME + " TEXT NOT NULL,"
+ FavoriteColumns.ALBUMNAME + " TEXT NOT NULL," + FavoriteColumns.ARTISTNAME
+ " TEXT NOT NULL," + FavoriteColumns.PLAYCOUNT + " LONG NOT NULL);");
}
/**
* {@inheritDoc}
*/
@Override
public void onUpgrade(final SQLiteDatabase db, final int oldVersion, final int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + FavoriteColumns.NAME);
onCreate(db);
}
/**
* @param context The {@link Context} to use
* @return A new instance of this class
*/
public static final synchronized FavoritesStore getInstance(final Context context) {
if (sInstance == null) {
sInstance = new FavoritesStore(context.getApplicationContext());
}
return sInstance;
}
/**
* Used to store song Ids in our database
*
* @param songId The album's ID
* @param songName The song name
* @param albumName The album name
* @param artistName The artist name
*/
public void addSongId(final Long songId, final String songName, final String albumName,
final String artistName) {
if (songId == null || songName == null || albumName == null || artistName == null) {
return;
}
final Long playCount = getPlayCount(songId);
final SQLiteDatabase database = getWritableDatabase();
final ContentValues values = new ContentValues(5);
database.beginTransaction();
values.put(FavoriteColumns.ID, songId);
values.put(FavoriteColumns.SONGNAME, songName);
values.put(FavoriteColumns.ALBUMNAME, albumName);
values.put(FavoriteColumns.ARTISTNAME, artistName);
values.put(FavoriteColumns.PLAYCOUNT, playCount != 0 ? playCount + 1 : 1);
database.delete(FavoriteColumns.NAME, FavoriteColumns.ID + " = ?", new String[] {
String.valueOf(songId)
});
database.insert(FavoriteColumns.NAME, null, values);
database.setTransactionSuccessful();
database.endTransaction();
}
/**
* Used to retrieve a single song Id from our database
*
* @param songId The song Id to reference
* @return The song Id
*/
public Long getSongId(final Long songId) {
if (songId <= -1) {
return null;
}
final SQLiteDatabase database = getReadableDatabase();
final String[] projection = new String[] {
FavoriteColumns.ID, FavoriteColumns.SONGNAME, FavoriteColumns.ALBUMNAME,
FavoriteColumns.ARTISTNAME, FavoriteColumns.PLAYCOUNT
};
final String selection = FavoriteColumns.ID + "=?";
final String[] having = new String[] {
String.valueOf(songId)
};
Cursor cursor = database.query(FavoriteColumns.NAME, projection, selection, having, null,
null, null, null);
if (cursor != null && cursor.moveToFirst()) {
final Long id = cursor.getLong(cursor.getColumnIndexOrThrow(FavoriteColumns.ID));
cursor.close();
cursor = null;
return id;
}
if (cursor != null) {
cursor.close();
cursor = null;
}
return null;
}
/**
* Used to retrieve the play count
*
* @param songId The song Id to reference
* @return The play count for a song
*/
public Long getPlayCount(final Long songId) {
if (songId <= -1) {
return null;
}
final SQLiteDatabase database = getReadableDatabase();
final String[] projection = new String[] {
FavoriteColumns.ID, FavoriteColumns.SONGNAME, FavoriteColumns.ALBUMNAME,
FavoriteColumns.ARTISTNAME, FavoriteColumns.PLAYCOUNT
};
final String selection = FavoriteColumns.ID + "=?";
final String[] having = new String[] {
String.valueOf(songId)
};
Cursor cursor = database.query(FavoriteColumns.NAME, projection, selection, having, null,
null, null, null);
if (cursor != null && cursor.moveToFirst()) {
final Long playCount = cursor.getLong(cursor
.getColumnIndexOrThrow(FavoriteColumns.PLAYCOUNT));
cursor.close();
cursor = null;
return playCount;
}
if (cursor != null) {
cursor.close();
cursor = null;
}
return (long)0;
}
/**
* Clear the cache.
*
* @param context The {@link Context} to use.
*/
public static void deleteDatabase(final Context context) {
context.deleteDatabase(DATABASENAME);
}
/**
* Toggle the current song as favorite
*/
public void toggleSong(final Long songId, final String songName, final String albumName,
final String artistName) {
if (getSongId(songId) == null) {
addSongId(songId, songName, albumName, artistName);
} else {
removeItem(songId);
}
}
/**
* @param item The song Id to remove
*/
public void removeItem(final Long songId) {
final SQLiteDatabase database = getReadableDatabase();
database.delete(FavoriteColumns.NAME, FavoriteColumns.ID + " = ?", new String[] {
String.valueOf(songId)
});
}
public interface FavoriteColumns {
/* Table name */
public static final String NAME = "favorites";
/* Song IDs column */
public static final String ID = "songid";
/* Song name column */
public static final String SONGNAME = "songname";
/* Album name column */
public static final String ALBUMNAME = "albumname";
/* Artist name column */
public static final String ARTISTNAME = "artistname";
/* Play count column */
public static final String PLAYCOUNT = "playcount";
}
}