package com.android.launcher3.stats.internal.db;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import com.android.launcher3.stats.internal.model.TrackingEvent;
import com.android.launcher3.stats.util.Logger;
import java.util.ArrayList;
import java.util.List;
/**
* <pre>
* Helper for accessing the database
* </pre>
*
* @see {@link SQLiteOpenHelper}
*/
public class DatabaseHelper extends SQLiteOpenHelper {
// Constants
private static final String TAG = DatabaseHelper.class.getSimpleName();
private static final String DATABASE_NAME = "events";
private static final int DATABASE_VERSION = 1;
// Instance
private static DatabaseHelper sInstance = null;
/**
* Constructor
*
* @param context {@link Context}
* @return {@link DatabaseHelper}
* @throws IllegalArgumentException {@link IllegalArgumentException}
*/
public static DatabaseHelper createInstance(Context context) throws IllegalArgumentException {
if (sInstance == null) {
sInstance = new DatabaseHelper(context);
}
return sInstance;
}
/**
* Constructor
*
* @param context {@link Context}
*/
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
/**
* Write an event to the database
*
* @param trackingEvent {@link TrackingEvent}
* @throws IllegalArgumentException {@link IllegalArgumentException}
*/
public void writeEvent(TrackingEvent trackingEvent)
throws IllegalArgumentException {
if (trackingEvent == null) {
throw new IllegalArgumentException("'trackingEvent' cannot be null!");
}
Logger.logd(TAG, "Event written to database: " + trackingEvent);
SQLiteDatabase db = getWritableDatabase();
ContentValues contentValues = trackingEvent.toContentValues();
db.insert(TrackingEventContract.EVENT_TABLE_NAME, null, contentValues);
db.close();
}
/**
* Get a list of tracking events
*
* @param instanceId {@link Integer}
* @return {@link List}
* @throws IllegalArgumentException {@link IllegalArgumentException}
*/
public List<TrackingEvent> getTrackingEventsByCategory(int instanceId,
TrackingEvent.Category category) throws IllegalArgumentException {
if (category == null) {
throw new IllegalArgumentException("'category' cannot be null!");
}
List<TrackingEvent> eventList = new ArrayList<TrackingEvent>();
// Get a writable database
SQLiteDatabase db = getWritableDatabase();
// Update unclaimed items for this instance
ContentValues contentValues = new ContentValues();
contentValues.put(TrackingEventContract.EVENT_COLUMN_INSTANCE, instanceId);
String whereClause = TrackingEventContract.EVENT_COLUMN_INSTANCE + " IS NULL AND "
+ TrackingEventContract.EVENT_COLUMN_CATEGORY + " = ? ";
String[] whereArgs = new String[] {
category.name(),
};
int cnt = db.update(TrackingEventContract.EVENT_TABLE_NAME, contentValues, whereClause,
whereArgs);
// Short circuit empty update
if (cnt < 1) {
return eventList;
}
// Select all tagged items
String selection = TrackingEventContract.EVENT_COLUMN_CATEGORY + " = ? AND "
+ TrackingEventContract.EVENT_COLUMN_INSTANCE + " = ? ";
String[] selectionArgs = new String[]{
category.name(),
String.valueOf(instanceId),
};
Cursor c = db.query(TrackingEventContract.EVENT_TABLE_NAME, null, selection, selectionArgs,
null, null, null);
// Build return list
while (c != null && c.getCount() > 0 && c.moveToNext()) {
eventList.add(new TrackingEvent(c));
}
db.close();
return eventList;
}
/**
* Deletes events related to the instance
*
* @param instanceId {@link Integer}
* @return {@link Integer}
*/
public int deleteEventsByInstanceId(int instanceId) {
SQLiteDatabase db = getWritableDatabase();
String whereClause = TrackingEventContract.EVENT_COLUMN_INSTANCE + " = ?";
String[] whereArgs = new String[]{
String.valueOf(instanceId),
};
int cnt = db.delete(TrackingEventContract.EVENT_TABLE_NAME, whereClause, whereArgs);
db.close();
return cnt;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(TrackingEventContract.CREATE_EVENT_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// [NOTE][MSB]: This will lose data, need to make sure this is handled if/when database
// schema changes
// db.execSQL("DROP TABLE IF EXISTS " + TrackingEventContract.EVENT_TABLE_NAME);
// onCreate(db);
}
}