package com.lesgens.blindr.db;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.UUID;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import com.lesgens.blindr.controllers.Controller;
import com.lesgens.blindr.models.Message;
import com.lesgens.blindr.models.User;
public class DatabaseHelper extends SQLiteOpenHelper
{
private static DatabaseHelper instance;
private DatabaseHelper(Context context) {
super(context, "db", null, 1);
}
public static void init(final Context context){
if(instance != null){
return;
}
instance = new DatabaseHelper(context);
}
public static DatabaseHelper getInstance(){
return instance;
}
public void onCreate(SQLiteDatabase db)
{
db.execSQL("CREATE TABLE blindr_message (id INTEGER PRIMARY KEY AUTOINCREMENT, message_id TEXT, conversation TEXT, fakeName TEXT, realName TEXT, message TEXT, timestamp LONG, isIncoming INTEGER DEFAULT 0);");
db.execSQL("CREATE TABLE blindr_last_message (id INTEGER PRIMARY KEY AUTOINCREMENT, remoteId TEXT, timestamp LONG);");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE if exists blindr_message");
db.execSQL("DROP TABLE if exists blindr_last_message");
onCreate(db);
}
public void addMessage(Message m, String remoteId){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put("message_id",m.getId().toString());
cv.put("fakeName", m.getFakeName());
cv.put("realName", m.getRealName());
cv.put("message", m.getMessage());
cv.put("isIncoming", m.isIncoming() ? 1 : 0);
cv.put("timestamp", m.getTimestamp().getTime());
cv.put("conversation", remoteId);
db.insert("blindr_message", null, cv);
cv = new ContentValues();
cv.put("timestamp", m.getTimestamp().getTime());
if(getLastMessageFetched(remoteId) == 0){
cv.put("remoteId", remoteId);
db.insert("blindr_last_message", null, cv);
} else{
db.update("blindr_last_message", cv, "remoteId = ?", new String[]{m.getUser().getId()});
}
}
public ArrayList<Message> getPrivateMessages(User user){
ArrayList<Message> messages = new ArrayList<Message>();
SQLiteDatabase db = this.getReadableDatabase();
Cursor c = db.rawQuery("SELECT message_id, timestamp, realName, fakeName, message, isIncoming FROM blindr_message WHERE conversation = ? ORDER BY timestamp ASC;", new String[]{user.getId()} );
Message message;
while(c.moveToNext()){
UUID id = UUID.fromString(c.getString(0));
Timestamp timestamp = new Timestamp(c.getLong(1));
String realName = c.getString(2);
String fakeName = c.getString(3);
String text = c.getString(4);
boolean isIncoming = c.getInt(5) == 1;
message = new Message(id, timestamp, isIncoming ? user : Controller.getInstance().getMyself(),
realName, fakeName, text, isIncoming);
messages.add(message);
}
return messages;
}
public long getLastMessageFetched(String remoteId){
SQLiteDatabase db = this.getReadableDatabase();
Cursor c = db.rawQuery("SELECT timestamp FROM blindr_last_message WHERE remoteId = ?;", new String[]{remoteId} );
if(c.moveToFirst()){
return c.getLong(0);
}
return 0;
}
public void eraseBD(){
this.onUpgrade(getWritableDatabase(), 0, 1);
}
}