PlayerAndroid/app/src/main/java/code/name/monkey/retromusic/providers/HistoryStore.java

151 lines
5.2 KiB
Java

/*
* Copyright (c) 2019 Hemanth Savarala.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by
* the Free Software Foundation either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*/
package code.name.monkey.retromusic.providers;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
public class HistoryStore extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "history.db";
private static final int MAX_ITEMS_IN_DB = 100;
private static final int VERSION = 1;
@Nullable
private static HistoryStore sInstance = null;
public HistoryStore(final Context context) {
super(context, DATABASE_NAME, null, VERSION);
}
@NonNull
public static synchronized HistoryStore getInstance(@NonNull final Context context) {
if (sInstance == null) {
sInstance = new HistoryStore(context.getApplicationContext());
}
return sInstance;
}
@Override
public void onCreate(@NonNull final SQLiteDatabase db) {
db.execSQL("CREATE TABLE IF NOT EXISTS " + RecentStoreColumns.NAME + " ("
+ RecentStoreColumns.ID + " LONG NOT NULL," + RecentStoreColumns.TIME_PLAYED
+ " LONG NOT NULL);");
}
@Override
public void onUpgrade(@NonNull SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + RecentStoreColumns.NAME);
onCreate(db);
}
@Override
public void onDowngrade(@NonNull SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + RecentStoreColumns.NAME);
onCreate(db);
}
public void addSongId(final long songId) {
if (songId == -1) {
return;
}
final SQLiteDatabase database = getWritableDatabase();
database.beginTransaction();
try {
// remove previous entries
removeSongId(songId);
// add the entry
final ContentValues values = new ContentValues(2);
values.put(RecentStoreColumns.ID, songId);
values.put(RecentStoreColumns.TIME_PLAYED, System.currentTimeMillis());
database.insert(RecentStoreColumns.NAME, null, values);
// if our db is too large, delete the extra items
Cursor oldest = null;
try {
oldest = database.query(RecentStoreColumns.NAME,
new String[]{RecentStoreColumns.TIME_PLAYED}, null, null, null, null,
RecentStoreColumns.TIME_PLAYED + " ASC");
if (oldest != null && oldest.getCount() > MAX_ITEMS_IN_DB) {
oldest.moveToPosition(oldest.getCount() - MAX_ITEMS_IN_DB);
long timeOfRecordToKeep = oldest.getLong(0);
database.delete(RecentStoreColumns.NAME,
RecentStoreColumns.TIME_PLAYED + " < ?",
new String[]{String.valueOf(timeOfRecordToKeep)});
}
} finally {
if (oldest != null) {
oldest.close();
}
}
} finally {
database.setTransactionSuccessful();
database.endTransaction();
}
}
public void removeSongId(final long songId) {
final SQLiteDatabase database = getWritableDatabase();
database.delete(RecentStoreColumns.NAME, RecentStoreColumns.ID + " = ?", new String[]{
String.valueOf(songId)
});
}
public void clear() {
final SQLiteDatabase database = getWritableDatabase();
database.delete(RecentStoreColumns.NAME, null, null);
}
public boolean contains(long id) {
final SQLiteDatabase database = getReadableDatabase();
Cursor cursor = database.query(RecentStoreColumns.NAME,
new String[]{RecentStoreColumns.ID},
RecentStoreColumns.ID + "=?",
new String[]{String.valueOf(id)},
null, null, null, null);
boolean containsId = cursor != null && cursor.moveToFirst();
if (cursor != null) {
cursor.close();
}
return containsId;
}
public Cursor queryRecentIds() {
final SQLiteDatabase database = getReadableDatabase();
return database.query(RecentStoreColumns.NAME,
new String[]{RecentStoreColumns.ID}, null, null, null, null,
RecentStoreColumns.TIME_PLAYED + " DESC");
}
public interface RecentStoreColumns {
String NAME = "recent_history";
String ID = "song_id";
String TIME_PLAYED = "time_played";
}
}