package org.sana.android.content;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.provider.BaseColumns;
import android.text.TextUtils;
import static java.lang.Long.SIZE;
/**
*
*/
public class MessageQueueProvider extends ContentProvider {
public static interface Contract{
public static final String AUTH = "_auth";
public static final String STATE = "_state";
public static final String PRIORITY = "_priority";
public static final String DATA = "_data";
public static final String SOURCE = "source";
public static final String TARGET = "target";
public static final String SENT = "sent";
public static final String SEND_COUNT = "send_count";
public static final String EVENT_START = "event_start";
public static final String EVENT_COMPLETE = "request_complete";
public static final String RECEIVED = "received";
public static final String REQUEST_COMPLETE = "request_complete";
}
public static enum State{
ERROR(-1),
CANCELLED(0),
COMPLETE(1),
WAITING(2),
SCHEDULED(4),
SENDING(8),;
final int code;
State(int code){
this.code = code;
}
public int code(){
return code;
}
}
public static enum Priority{
LOW(8),
HIGH(1),
FIRST(0);
public final long priority;
Priority(long i){
this.priority = i;
}
public long val(){
return priority;
}
}
protected static final class MessageQueueHelper extends SQLiteOpenHelper {
public static final String CREATE = "CREATE TABLE messages (" +
BaseColumns._ID + " INTEGER PRIMARY KEY, " +
Contract.AUTH + " TEXT, " +
Contract.PRIORITY + " INTEGER, " +
Contract.STATE + " INTEGER, " +
Contract.DATA + " TEXT, " +
Contract.SOURCE + " TEXT, " +
Contract.TARGET + " TEXT, " +
Contract.SENT + " INTEGER, " +
Contract.SEND_COUNT + " INTEGER," +
Contract.EVENT_START + " INTEGER," +
Contract.EVENT_COMPLETE + " INTEGER," +
Contract.RECEIVED + " INTEGER," +
Contract.REQUEST_COMPLETE + " INTEGER );";
public MessageQueueHelper(Context context, String name, int version) {
super(context, name, null, version);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL(CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
// TODO
}
}
public static final String TAG = MessageQueueProvider.class.getSimpleName();
public static final String AUTHORITY = "org.sana.provider.dispatch";
public static final String TABLE = "messages";
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY
+ "/message/");
public static final UriMatcher sUriMatcher = new UriMatcher(0);
static{
sUriMatcher.addURI(AUTHORITY, "message/", 1);
sUriMatcher.addURI(AUTHORITY, "message/#", 2);
}
protected static final String DATABASE = "messages.db";
private MessageQueueHelper mOpenHelper;
@Override
public boolean onCreate() {
mOpenHelper = new MessageQueueHelper(getContext(),DATABASE, 1);
return true;
}
@Override
public Cursor query(Uri uri, String[] strings, String s, String[] strings1, String s1) {
switch (sUriMatcher.match(uri)) {
case 1:
s1 = (TextUtils.isEmpty(s1))? BaseColumns._ID + " _ASC": s1;
break;
case 2:
s = s + BaseColumns._ID + " = " + uri.getLastPathSegment();
}
SQLiteDatabase db = mOpenHelper.getReadableDatabase();
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
qb.setTables(TABLE);
Cursor c = qb.query(db, strings, s, strings1, null, null,
s1);
return c;
}
@Override
public String getType(Uri uri) {
return null;
}
@Override
public Uri insert(Uri uri, ContentValues contentValues) {
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
if(!contentValues.containsKey("_priority")){
contentValues.put("_priority", 1);
}
if(!contentValues.containsKey("_state")){
contentValues.put("_state", 1);
}
long id = db.insert(TABLE, null, contentValues);
getContext().getContentResolver().notifyChange(uri, null);
Uri result = ContentUris.withAppendedId(uri, id);
db.close();
return result;
}
@Override
public int delete(Uri uri, String s, String[] strings) {
switch (sUriMatcher.match(uri)) {
case 2:
s = s + BaseColumns._ID + " = " + uri.getLastPathSegment();
}
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
int count = db.delete(TABLE, s, strings);
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
@Override
public int update(Uri uri, ContentValues contentValues, String s, String[] strings) {
switch (sUriMatcher.match(uri)) {
case 2:
s = s + BaseColumns._ID + " = " + uri.getLastPathSegment();
}
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
int updated = db.update(TABLE, contentValues, s, strings);
getContext().getContentResolver().notifyChange(uri, null);
return updated;
}
}