package com.buddycloud.model.dao;
import java.util.Map;
import org.json.JSONException;
import org.json.JSONObject;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.buddycloud.model.db.BuddycloudSQLiteOpenHelper;
import com.buddycloud.model.db.UnreadCountersTableHelper;
import com.buddycloud.preferences.Preferences;
public class UnreadCountersDAO implements DAO<JSONObject, JSONObject> {
private static UnreadCountersDAO instance;
private SQLiteDatabase db;
private BuddycloudSQLiteOpenHelper helper;
private String myJid;
private final String[] COLUMNS = new String[] {
UnreadCountersTableHelper.COLUMN_CHANNEL,
UnreadCountersTableHelper.COLUMN_MENTIONS_COUNT,
UnreadCountersTableHelper.COLUMN_TOTAL_COUNT,
UnreadCountersTableHelper.COLUMN_REPLY_COUNT,
UnreadCountersTableHelper.COLUMN_VISIT_COUNT,
UnreadCountersTableHelper.COLUMN_LAST_WEEK_ACTIVITY};
private UnreadCountersDAO(Context context) {
this.helper = BuddycloudSQLiteOpenHelper.getInstance(context);
this.db = helper.getWritableDatabase();
this.myJid = Preferences.getPreference(context, Preferences.MY_CHANNEL_JID);
}
public static UnreadCountersDAO getInstance(Context context) {
if (instance == null) {
instance = new UnreadCountersDAO(context);
}
return instance;
}
private ContentValues buildValues(String channel, int mentionsCount, int totalCount,
int replyCount, int visitCount, int lastWeekActivity) {
ContentValues values = new ContentValues();
values.put(UnreadCountersTableHelper.COLUMN_USER, myJid);
values.put(UnreadCountersTableHelper.COLUMN_CHANNEL, channel);
values.put(UnreadCountersTableHelper.COLUMN_MENTIONS_COUNT, mentionsCount);
values.put(UnreadCountersTableHelper.COLUMN_TOTAL_COUNT, totalCount);
values.put(UnreadCountersTableHelper.COLUMN_REPLY_COUNT, replyCount);
values.put(UnreadCountersTableHelper.COLUMN_VISIT_COUNT, visitCount);
values.put(UnreadCountersTableHelper.COLUMN_LAST_WEEK_ACTIVITY, lastWeekActivity);
return values;
}
private ContentValues buildValues(String channel, JSONObject counter) {
int mentionsCount = counter.optInt("mentionsCount");
int totalCount = counter.optInt("totalCount");
int replyCount = counter.optInt("replyCount");
int visitCount = counter.optInt("visitCount");
int lastWeekActivity = counter.optInt("lastWeekActivity");
return buildValues(channel, mentionsCount, totalCount, replyCount,
visitCount, lastWeekActivity);
}
public void delete(String channelJid) {
String filter = UnreadCountersTableHelper.COLUMN_USER + "=\"" + myJid + "\" AND " +
UnreadCountersTableHelper.COLUMN_CHANNEL + "=\"" + channelJid + "\"";
db.delete(UnreadCountersTableHelper.TABLE_NAME, filter, null);
}
public boolean insert(String channel, JSONObject counter) {
ContentValues values = buildValues(channel, counter);
if (values != null) {
long rowId = db.insert(UnreadCountersTableHelper.TABLE_NAME, null, values);
return rowId != -1;
}
return false;
}
public boolean update(String channel, JSONObject counter) {
ContentValues values = buildValues(channel, counter);
if (values != null) {
String filter = UnreadCountersTableHelper.COLUMN_USER + "=\"" + myJid + "\" AND " +
UnreadCountersTableHelper.COLUMN_CHANNEL + "=\"" + channel + "\"";
int rowsAffected = db.update(UnreadCountersTableHelper.TABLE_NAME,
values, filter, null);
return rowsAffected == 1;
}
return false;
}
public boolean resetUnreadCounters() {
ContentValues values = new ContentValues();
values.put(UnreadCountersTableHelper.COLUMN_USER, myJid);
values.put(UnreadCountersTableHelper.COLUMN_TOTAL_COUNT, 0);
values.put(UnreadCountersTableHelper.COLUMN_REPLY_COUNT, 0);
values.put(UnreadCountersTableHelper.COLUMN_MENTIONS_COUNT, 0);
String filter = UnreadCountersTableHelper.COLUMN_USER + "=\"" + myJid + "\"";
int rowsAffected = db.update(UnreadCountersTableHelper.TABLE_NAME,
values, filter, null);
return rowsAffected == 1;
}
public JSONObject get(String channel) {
String filter = UnreadCountersTableHelper.COLUMN_USER + "=\"" + myJid + "\" AND " +
UnreadCountersTableHelper.COLUMN_CHANNEL + "=\"" + channel + "\"";
return DAOHelper.queryUniqueOnSameThread(db, false, UnreadCountersTableHelper.TABLE_NAME, COLUMNS, filter,
null, null, null, null, null, cursorParser());
}
private DAOCursorParser cursorParser() {
DAOCursorParser cursorParser = new DAOCursorParser() {
@Override
public JSONObject parse(Cursor c) {
return cursorToJSON(c);
}
};
return cursorParser;
}
public Map<String, JSONObject> getAll() {
String filter = UnreadCountersTableHelper.COLUMN_USER + "=\"" + myJid + "\"";
return DAOHelper.queryMapOnSameThread(db, false, UnreadCountersTableHelper.TABLE_NAME,
COLUMNS, filter, null, null, null, null, null, cursorParser(),
UnreadCountersTableHelper.COLUMN_CHANNEL);
}
private JSONObject cursorToJSON(Cursor cursor) {
JSONObject json = new JSONObject();
try {
json.put(UnreadCountersTableHelper.COLUMN_CHANNEL,
getString(cursor, UnreadCountersTableHelper.COLUMN_CHANNEL));
json.put(UnreadCountersTableHelper.COLUMN_MENTIONS_COUNT,
getInt(cursor, UnreadCountersTableHelper.COLUMN_MENTIONS_COUNT));
json.put(UnreadCountersTableHelper.COLUMN_TOTAL_COUNT,
getInt(cursor, UnreadCountersTableHelper.COLUMN_TOTAL_COUNT));
json.put(UnreadCountersTableHelper.COLUMN_REPLY_COUNT,
getInt(cursor, UnreadCountersTableHelper.COLUMN_REPLY_COUNT));
json.put(UnreadCountersTableHelper.COLUMN_VISIT_COUNT,
getInt(cursor, UnreadCountersTableHelper.COLUMN_VISIT_COUNT));
json.put(UnreadCountersTableHelper.COLUMN_LAST_WEEK_ACTIVITY,
getInt(cursor, UnreadCountersTableHelper.COLUMN_LAST_WEEK_ACTIVITY));
} catch (JSONException e) {
return null;
}
return json;
}
private int getInt(Cursor cursor, String columnName) {
return cursor.getInt(cursor.getColumnIndex(columnName));
}
private String getString(Cursor cursor, String columnName) {
return cursor.getString(cursor.getColumnIndex(columnName));
}
}