/*
* 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;
import android.text.TextUtils;
//import com.andrew.apollo.ui.activities.ProfileActivity;
/**
* The {@link RecentlyListenedFragment} is used to display a grid or list of
* recently listened to albums. In order to populate the this grid or list with
* the correct data, we keep a cache of the album ID, name, and time it was
* played to be retrieved later.
* <p>
* In {@link ProfileActivity}, when viewing the profile for an artist, the first
* image the carousel header is the last album the user listened to for that
* particular artist. That album is retrieved using
* {@link #getAlbumName(String)}.
*
* @author Andrew Neal (andrewdneal@gmail.com)
*/
public class RecentStore 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 = "albumhistory.db";
private static RecentStore sInstance = null;
/**
* Constructor of <code>RecentStore</code>
*
* @param context The {@link Context} to use
*/
public RecentStore(final Context context) {
super(context, DATABASENAME, null, VERSION);
}
/**
* {@inheritDoc}
*/
@Override
public void onCreate(final SQLiteDatabase db) {
db.execSQL("CREATE TABLE IF NOT EXISTS " + RecentStoreColumns.NAME + " ("
+ RecentStoreColumns.ID + " LONG NOT NULL," + RecentStoreColumns.ALBUMNAME
+ " TEXT NOT NULL," + RecentStoreColumns.ARTISTNAME + " TEXT NOT NULL,"
+ RecentStoreColumns.ALBUMSONGCOUNT + " TEXT NOT NULL,"
+ RecentStoreColumns.ALBUMYEAR + " TEXT," + RecentStoreColumns.TIMEPLAYED
+ " LONG NOT NULL);");
}
/**
* {@inheritDoc}
*/
@Override
public void onUpgrade(final SQLiteDatabase db, final int oldVersion, final int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + RecentStoreColumns.NAME);
onCreate(db);
}
/**
* @param context The {@link Context} to use
* @return A new instance of this class.
*/
public static final synchronized RecentStore getInstance(final Context context) {
if (sInstance == null) {
sInstance = new RecentStore(context.getApplicationContext());
}
return sInstance;
}
/**
* Used to store artist IDs in the database.
*
* @param albumIDdThe album's ID.
* @param albumName The album name.
* @param artistName The artist album name.
* @param songCount The number of tracks for the album.
* @param albumYear The year the album was released.
*/
public void addAlbumId(final Long albumId, final String albumName, final String artistName,
final String songCount, final String albumYear) {
if (albumId == null || albumName == null || artistName == null || songCount == null) {
return;
}
try {
final SQLiteDatabase database = getWritableDatabase();
final ContentValues values = new ContentValues(6);
database.beginTransaction();
values.put(RecentStoreColumns.ID, albumId);
values.put(RecentStoreColumns.ALBUMNAME, albumName);
values.put(RecentStoreColumns.ARTISTNAME, artistName);
values.put(RecentStoreColumns.ALBUMSONGCOUNT, songCount);
values.put(RecentStoreColumns.ALBUMYEAR, albumYear);
values.put(RecentStoreColumns.TIMEPLAYED, System.currentTimeMillis());
database.delete(RecentStoreColumns.NAME, RecentStoreColumns.ID + " = ?", new String[]{
String.valueOf(albumId)
});
database.insert(RecentStoreColumns.NAME, null, values);
database.setTransactionSuccessful();
database.endTransaction();
} catch (Throwable e) {
// not critical at all
e.printStackTrace();
}
}
/**
* Used to retrieve the most recently listened album for an artist.
*
* @param key The key to reference.
* @return The most recently listened album for an artist.
*/
public String getAlbumName(final String key) {
if (TextUtils.isEmpty(key)) {
return null;
}
final SQLiteDatabase database = getReadableDatabase();
final String[] projection = new String[] {
RecentStoreColumns.ID, RecentStoreColumns.ALBUMNAME, RecentStoreColumns.ARTISTNAME,
RecentStoreColumns.TIMEPLAYED
};
final String selection = RecentStoreColumns.ARTISTNAME + "=?";
final String[] having = new String[] {
key
};
Cursor cursor = database.query(RecentStoreColumns.NAME, projection, selection, having,
null, null, RecentStoreColumns.TIMEPLAYED + " DESC", null);
if (cursor != null && cursor.moveToFirst()) {
cursor.moveToFirst();
final String album = cursor.getString(cursor
.getColumnIndexOrThrow(RecentStoreColumns.ALBUMNAME));
cursor.close();
cursor = null;
return album;
}
if (cursor != null && !cursor.isClosed()) {
cursor.close();
cursor = null;
}
return null;
}
/**
* Clear the cache.
*/
public void deleteDatabase() {
final SQLiteDatabase database = getReadableDatabase();
database.delete(RecentStoreColumns.NAME, null, null);
}
/**
* @param item The album Id to remove.
*/
public void removeItem(final long albumId) {
final SQLiteDatabase database = getReadableDatabase();
database.delete(RecentStoreColumns.NAME, RecentStoreColumns.ID + " = ?", new String[] {
String.valueOf(albumId)
});
}
public interface RecentStoreColumns {
/* Table name */
public static final String NAME = "albumhistory";
/* Album IDs column */
public static final String ID = "albumid";
/* Album name column */
public static final String ALBUMNAME = "itemname";
/* Artist name column */
public static final String ARTISTNAME = "artistname";
/* Album song count column */
public static final String ALBUMSONGCOUNT = "albumsongcount";
/* Album year column. It's okay for this to be null */
public static final String ALBUMYEAR = "albumyear";
/* Time played column */
public static final String TIMEPLAYED = "timeplayed";
}
}