package com.magnet.wru; import android.content.ContentValues; import android.content.Context; import android.content.SharedPreferences; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.provider.BaseColumns; import android.util.Log; import java.util.ArrayList; import java.util.Date; import java.util.List; public class EventLog { private static final String TAG = EventLog.class.getSimpleName(); private static final String PREF_ENABLED = "enabled"; private SharedPreferences mSharedPrefs = null; private boolean mIsEnabled; public enum Type {ERROR, INFO} private static EventLog sInstance = null; private Context mContext = null; private DBHelper mDbHelper = null; private EventLog(Context context) { mContext = context.getApplicationContext(); mDbHelper = new DBHelper(mContext); mSharedPrefs = context.getSharedPreferences(TAG, Context.MODE_PRIVATE); mIsEnabled = mSharedPrefs.getBoolean(PREF_ENABLED, false); } public synchronized static EventLog getInstance(Context context) { if (sInstance == null) { sInstance = new EventLog(context); } return sInstance; } public boolean isEnabled() { return mIsEnabled; } public void setEnabled(boolean isEnabled) { mSharedPrefs.edit().putBoolean(PREF_ENABLED, isEnabled).apply(); mIsEnabled = isEnabled; } public void add(Type type, String text) { if (mIsEnabled) { SQLiteDatabase db = mDbHelper.getWritableDatabase(); try { ContentValues values = new ContentValues(); values.put(DBHelper.SQL.EventTable.COL_TEXT, text); values.put(DBHelper.SQL.EventTable.COL_TYPE, type.name()); values.put(DBHelper.SQL.EventTable.COL_TIMESTAMP, System.currentTimeMillis()); long rowId = db.insert(DBHelper.SQL.EventTable.TABLE_NAME, "", values); if (rowId >= 0) { Log.d(TAG, "add(): success"); } else { Log.w(TAG, "add(): failure"); } } catch (Exception ex) { //db may not have been created yet. Log.w(TAG, "add(): caught exception. Most likely database is being initialized", ex); } } } public void clear() { SQLiteDatabase db = mDbHelper.getWritableDatabase(); db.execSQL(DBHelper.SQL.DELETE_EVENTS); } public List<Event> listEvents(Type type, int maxItems) { SQLiteDatabase db = mDbHelper.getReadableDatabase(); ArrayList<Event> result = new ArrayList<>(); Cursor cursor = null; try { StringBuilder where = new StringBuilder(); if (type != null) { where.append(DBHelper.SQL.EventTable.COL_TYPE).append("='").append(type.name()).append("'"); } String orderBy = DBHelper.SQL.EventTable.COL_TIMESTAMP + " DESC"; String limit = String.valueOf(maxItems); cursor = db.query(DBHelper.SQL.EventTable.TABLE_NAME, null, where.toString(), null, null, null, orderBy, limit); int idxText = cursor.getColumnIndex(DBHelper.SQL.EventTable.COL_TEXT); int idxTimestamp = cursor.getColumnIndex(DBHelper.SQL.EventTable.COL_TIMESTAMP); int idxType = cursor.getColumnIndex(DBHelper.SQL.EventTable.COL_TYPE); while (cursor.moveToNext()) { result.add(new Event(Type.valueOf(cursor.getString(idxType)), cursor.getString(idxText), new Date(cursor.getLong(idxTimestamp)))); } cursor.close(); } finally { if (cursor != null) { cursor.close(); } } return result; } public static class Event { public final Type type; public final String text; public final Date timestamp; private Event(Type type, String text, Date timestamp) { this.type = type; this.text = text; this.timestamp = timestamp; } } private class DBHelper extends SQLiteOpenHelper { private static final String NAME = "EventLog"; private static final int VERSION = 1; private class SQL { private class EventTable implements BaseColumns { private static final String TABLE_NAME = "events"; private static final String COL_TEXT = "text"; private static final String COL_TYPE = "type"; private static final String COL_TIMESTAMP = "timestamp"; } private static final String CREATE_EVENT_TABLE = "CREATE TABLE " + EventTable.TABLE_NAME + " ( " + EventTable.COL_TEXT + " TEXT NOT NULL, " + EventTable.COL_TYPE + " TEXT NOT NULL, " + EventTable.COL_TIMESTAMP + " TEXT NOT NULL)"; private static final String DELETE_EVENTS = "DELETE FROM " + EventTable.TABLE_NAME; } public DBHelper(Context context) { super(context, NAME, null, VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(SQL.CREATE_EVENT_TABLE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } } }