Issue #60
authordasilvj@jean-manuel-da-silvas-macbook.local
Sat, 28 Mar 2009 03:36:14 -0400
changeset 44 ff7b74becc50
parent 41 c537c1ea3636
child 45 ae035477b6aa
Issue #60 Création d'un package pour les providers. Ecritures des providers pour les Utilisateurs de BEEM et leurs contacts.
src/com/beem/project/beem/provider/Beem.java
src/com/beem/project/beem/provider/BeemDatabaseHelper.java
src/com/beem/project/beem/provider/ContactProvider.java
src/com/beem/project/beem/provider/UserProvider.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/com/beem/project/beem/provider/Beem.java	Sat Mar 28 03:36:14 2009 -0400
@@ -0,0 +1,157 @@
+package com.beem.project.beem.provider;
+
+import android.net.Uri;
+import android.provider.BaseColumns;
+
+/**
+ * Convenience definitions for BEEM's providers
+ */
+public final class Beem {
+
+	public final static String 	AUTHORITY = "com.beem.project.provider";
+
+	public final static String	DB_NAME = "beem.db";
+	public final static int		DB_VERSION = 2;
+
+	public final static String	USERS_TABLE_NAME = "users";
+	public final static String	CONTACTS_TABLE_NAME = "contacts";
+
+	/**
+	 * Constructor
+	 */
+	private Beem() {}
+
+
+	/**
+	 * Users table
+	 */
+	public static final class Users implements BaseColumns {
+		
+		/**
+		 * The query used to create the table
+		 */
+		public final static String	QUERY_CREATE = 
+			"CREATE TABLE " + Beem.USERS_TABLE_NAME + " ("
+			+ Users._ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
+			+ Users.JUSERNAME + " TEXT,"
+			+ Users.DATE_CREATED + " INTEGER,"
+			+ Users.DATE_MODIFIED + " INTEGER"
+			+ ");";
+		
+		/**
+		 * The content:// style URL for Contacts table
+		 */
+		public final static Uri		CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/users");
+
+		/**
+		 * The MIME type of {@link #CONTENT_URI} providing a directory of users.
+		 */
+		public static final String	CONTENT_TYPE = "vnd.android.cursor.dir/vnd.beem.project.user";
+
+		/**
+		 * The MIME type of a {@link #CONTENT_URI} sub-directory of a single user.
+		 */
+		public static final String	CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.beem.project.user";
+
+		/**
+		 * The default sort order for this table
+		 */
+		public final static String 	DEFAULT_SORT_ORDER = "_id ASC";
+
+		/**
+		 * The Jabber username of the user
+		 * <P>Type: TEXT</P>
+		 */
+		public final static String	JUSERNAME = "username";
+		
+		/**
+		 * The timestamp for when the user was created
+		 * <P>Type: INTEGER (long from System.curentTimeMillis())</P>
+		 */
+		public final static String	DATE_CREATED = "created";
+
+		/**
+		 * The timestamp for when the user was last modified
+		 * <P>Type: INTEGER (long from System.curentTimeMillis())</P>
+		 */
+		public final static String	DATE_MODIFIED = "modified";
+	}
+
+
+	/**
+	 * Contacts table
+	 */
+	public static final class Contacts implements BaseColumns {
+
+		/**
+		 * The query used to create the table
+		 */
+		public final static String	QUERY_CREATE = 
+			"CREATE TABLE " + Beem.CONTACTS_TABLE_NAME + " ("
+			+ Contacts._ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
+			+ Contacts.UID + " INTEGER, "
+			+ Contacts.JID + " INTEGER,"
+			+ Contacts.NICKNAME + " TEXT,"
+			+ Contacts.ALIAS + " TEXT,"
+			+ Contacts.DATE_CREATED + " INTEGER,"
+			+ Contacts.DATE_MODIFIED + " INTEGER"
+			+ ");";
+
+		/**
+		 * The content:// style URL for Contacts table
+		 */
+		public final static Uri		CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/contacts");
+
+		/**
+		 * The MIME type of {@link #CONTENT_URI} providing a directory of contacts.
+		 */
+		public static final String	CONTENT_TYPE = "vnd.android.cursor.dir/vnd.beem.project.contact";
+
+		/**
+		 * The MIME type of a {@link #CONTENT_URI} sub-directory of a single contact.
+		 */
+		public static final String	CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.beem.project.contact";
+
+		/**
+		 * The default sort order for this table
+		 */
+		public final static String 	DEFAULT_SORT_ORDER = "nickname ASC";
+
+		/**
+		 * The user id having the contact
+		 * <P>Type: INTEGER</P>
+		 */
+		public final static String	UID = "uid";
+
+		/**
+		 * The JabberID of the contact
+		 * <P>Type: INTEGER</P>
+		 */
+		public final static String	JID = "jid";
+
+		/**
+		 * The nickname of the contact
+		 * <P>Type: TEXT</P>
+		 */
+		public final static String	NICKNAME = "nickname";
+
+		/**
+		 * The alias of the contact
+		 * <P>Type: TEXT</P>
+		 */
+		public final static String	ALIAS = "alias";
+
+		/**
+		 * The timestamp for when the contact was created
+		 * <P>Type: INTEGER (long from System.curentTimeMillis())</P>
+		 */
+		public final static String	DATE_CREATED = "created";
+
+		/**
+		 * The timestamp for when the contact was last modified
+		 * <P>Type: INTEGER (long from System.curentTimeMillis())</P>
+		 */
+		public final static String	DATE_MODIFIED = "modified";
+
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/com/beem/project/beem/provider/BeemDatabaseHelper.java	Sat Mar 28 03:36:14 2009 -0400
@@ -0,0 +1,34 @@
+package com.beem.project.beem.provider;
+
+import android.content.Context;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.util.Log;
+
+public class BeemDatabaseHelper extends SQLiteOpenHelper {
+	
+	private String tag;
+	private String tableName;
+	private String creationQuery;
+
+	public BeemDatabaseHelper(Context context, String tag, String tableName, String creationQuery) {
+		super(context, Beem.DB_NAME, null, Beem.DB_VERSION);
+		
+		this.tag = tag;
+		this.tableName = tableName;
+		this.creationQuery = creationQuery;
+	}
+	
+	@Override
+	public void onCreate(SQLiteDatabase db) {
+		db.execSQL(this.creationQuery);
+	}
+
+	@Override
+	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+		Log.w(this.tag, "Upgrading database from version " + oldVersion + " to "
+				+ newVersion + ", which will destroy all old data");
+		db.execSQL("DROP TABLE IF EXISTS " + this.tableName + ";");
+		onCreate(db);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/com/beem/project/beem/provider/ContactProvider.java	Sat Mar 28 03:36:14 2009 -0400
@@ -0,0 +1,210 @@
+/**
+ * 
+ */
+package com.beem.project.beem.provider;
+
+import java.util.HashMap;
+
+import android.content.ContentProvider;
+import android.content.ContentUris;
+import android.content.ContentValues;
+import android.content.UriMatcher;
+import android.content.res.Resources;
+import android.database.Cursor;
+import android.database.SQLException;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteQueryBuilder;
+import android.net.Uri;
+import android.text.TextUtils;
+
+/**
+ * @author dasilvj
+ *
+ */
+public class ContactProvider extends ContentProvider {
+
+	private final static String				TAG = "ContactProvider";
+
+	private static HashMap<String, String>	sContactsProjectionMap;
+
+	private static final int				CONTACTS = 1;
+	private static final int				CONTACT_ID = 2;
+
+	private static final UriMatcher			sUriMatcher;
+	private BeemDatabaseHelper				mOpenHelper;
+
+	@Override
+	public int delete(Uri uri, String selection, String[] selectionArgs) {
+		SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+		int count;
+
+		switch (sUriMatcher.match(uri)) {
+		case CONTACTS:
+			count = db.delete(Beem.CONTACTS_TABLE_NAME, selection, selectionArgs);
+			break;
+
+		case CONTACT_ID:
+			String contactId = uri.getPathSegments().get(1);
+			count = db.delete(Beem.CONTACTS_TABLE_NAME, Beem.Contacts._ID + "=" + contactId
+					+ (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : ""), selectionArgs);
+			break;
+
+		default:
+			throw new IllegalArgumentException("Unknown URI " + uri);
+		}
+
+		getContext().getContentResolver().notifyChange(uri, null);
+		return count;
+	}
+
+	@Override
+	public String getType(Uri uri) {
+		switch (sUriMatcher.match(uri)) {
+		case CONTACTS:
+			return Beem.Contacts.CONTENT_TYPE;
+
+		case CONTACT_ID:
+			return Beem.Contacts.CONTENT_ITEM_TYPE;
+
+		default:
+			throw new IllegalArgumentException("Unknown URI " + uri);
+		}
+	}
+
+	@Override
+	public Uri insert(Uri uri, ContentValues initialValues) {
+        // Validate the requested uri
+        if (sUriMatcher.match(uri) != CONTACTS) {
+            throw new IllegalArgumentException("Unknown URI " + uri);
+        }
+
+        ContentValues values;
+        if (initialValues != null) {
+            values = new ContentValues(initialValues);
+        } else {
+            values = new ContentValues();
+        }
+
+        Long now = Long.valueOf(System.currentTimeMillis());
+
+        // Make sure that the fields are all set
+        if (values.containsKey(Beem.Contacts.UID) == false) {
+        	// TODO :: Must check that the UID exists using UserProvider
+            throw new SQLException("No UID specified. Failed to insert row into " + uri);
+        }
+
+        if (values.containsKey(Beem.Contacts.JID) == false) {
+            values.put(Beem.Contacts.JID, "");
+        }
+        
+        if (values.containsKey(Beem.Contacts.NICKNAME) == false) {
+            values.put(Beem.Contacts.JID, "");
+        }
+        
+        if (values.containsKey(Beem.Contacts.ALIAS) == false) {
+            values.put(Beem.Contacts.JID, "");
+        }
+        
+        if (values.containsKey(Beem.Contacts.DATE_CREATED) == false) {
+            values.put(Beem.Contacts.DATE_CREATED, now);
+        }
+
+        if (values.containsKey(Beem.Contacts.DATE_MODIFIED) == false) {
+            values.put(Beem.Contacts.DATE_MODIFIED, now);
+        }
+
+        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+        long rowId = db.insert(Beem.CONTACTS_TABLE_NAME, Beem.Contacts._ID, values);
+        if (rowId > 0) {
+            Uri contactUri = ContentUris.withAppendedId(Beem.Contacts.CONTENT_URI, rowId);
+            getContext().getContentResolver().notifyChange(contactUri, null);
+            return contactUri;
+        }
+
+        throw new SQLException("Failed to insert row into " + uri);
+	}
+
+	@Override
+	public boolean onCreate() {
+		mOpenHelper = new BeemDatabaseHelper(getContext(), TAG, Beem.CONTACTS_TABLE_NAME, Beem.Contacts.QUERY_CREATE);
+		return true;
+	}
+
+	@Override
+	public Cursor query(Uri uri, String[] projection, String selection,
+			String[] selectionArgs, String sortOrder) {
+		SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
+
+		switch (sUriMatcher.match(uri)) {
+		case CONTACTS:
+			qb.setTables(Beem.CONTACTS_TABLE_NAME);
+			qb.setProjectionMap(sContactsProjectionMap);
+			break;
+
+		case CONTACT_ID:
+			qb.setTables(Beem.USERS_TABLE_NAME);
+			qb.setProjectionMap(sContactsProjectionMap);
+			qb.appendWhere(Beem.Contacts._ID + "=" + uri.getPathSegments().get(1));
+			break;
+
+		default:
+			throw new IllegalArgumentException("Unknown URI " + uri);        
+		}
+
+		// If no sort order is specified use the default
+		String orderBy;
+		if (TextUtils.isEmpty(sortOrder)) {
+			orderBy = Beem.Contacts.DEFAULT_SORT_ORDER;
+		} else {
+			orderBy = sortOrder;
+		}
+
+		// Get the database and run the query
+		SQLiteDatabase db = mOpenHelper.getReadableDatabase();
+		Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy);
+
+		// Tell the cursor what uri to watch, so it knows when its source data changes
+		c.setNotificationUri(getContext().getContentResolver(), uri);
+		return c;
+	}
+
+	@Override
+	public int update(Uri uri, ContentValues values, String selection,
+			String[] selectionArgs) {
+        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+        int count;
+        
+        switch (sUriMatcher.match(uri)) {
+        case CONTACTS:
+            count = db.update(Beem.CONTACTS_TABLE_NAME, values, selection, selectionArgs);
+            break;
+
+        case CONTACT_ID:
+            String contactId = uri.getPathSegments().get(1);
+            count = db.update(Beem.CONTACTS_TABLE_NAME, values, Beem.Contacts._ID + "=" + contactId
+                    + (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : ""), selectionArgs);
+            break;
+
+        default:
+            throw new IllegalArgumentException("Unknown URI " + uri);
+        }
+
+        getContext().getContentResolver().notifyChange(uri, null);
+        return count;
+	}
+
+	static {
+		sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
+		sUriMatcher.addURI(Beem.AUTHORITY, "contacts", CONTACTS);
+		sUriMatcher.addURI(Beem.AUTHORITY, "contacts/#", CONTACT_ID);
+
+		sContactsProjectionMap = new HashMap<String, String>();
+		sContactsProjectionMap.put(Beem.Contacts._ID, Beem.Contacts._ID);
+		sContactsProjectionMap.put(Beem.Contacts.UID, Beem.Contacts.UID);
+		sContactsProjectionMap.put(Beem.Contacts.JID, Beem.Contacts.JID);
+		sContactsProjectionMap.put(Beem.Contacts.NICKNAME, Beem.Contacts.NICKNAME);
+		sContactsProjectionMap.put(Beem.Contacts.ALIAS, Beem.Contacts.ALIAS);
+		sContactsProjectionMap.put(Beem.Contacts.DATE_CREATED, Beem.Contacts.DATE_CREATED);
+		sContactsProjectionMap.put(Beem.Contacts.DATE_MODIFIED, Beem.Contacts.DATE_MODIFIED);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/com/beem/project/beem/provider/UserProvider.java	Sat Mar 28 03:36:14 2009 -0400
@@ -0,0 +1,186 @@
+package com.beem.project.beem.provider;
+
+import java.util.HashMap;
+
+import android.content.ContentProvider;
+import android.content.ContentUris;
+import android.content.ContentValues;
+import android.content.UriMatcher;
+import android.database.Cursor;
+import android.database.SQLException;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteQueryBuilder;
+import android.net.Uri;
+import android.text.TextUtils;
+
+public class UserProvider extends ContentProvider {
+
+	private final static String				TAG = "UserProvider";
+
+	private static HashMap<String, String>	sUsersProjectionMap;
+
+	private static final int				USERS = 1;
+	private static final int				USER_ID = 2;
+
+	private static final UriMatcher			sUriMatcher;
+	private BeemDatabaseHelper				mOpenHelper;
+
+	@Override
+	public int delete(Uri uri, String selection, String[] selectionArgs) {
+		SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+		int count;
+
+		switch (sUriMatcher.match(uri)) {
+		case USERS:
+			count = db.delete(Beem.USERS_TABLE_NAME, selection, selectionArgs);
+			break;
+
+		case USER_ID:
+			String userID = uri.getPathSegments().get(1);
+			count = db.delete(Beem.USERS_TABLE_NAME, Beem.Users._ID + "=" + userID
+					+ (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : ""), selectionArgs);
+			break;
+
+		default:
+			throw new IllegalArgumentException("Unknown URI " + uri);
+		}
+
+		getContext().getContentResolver().notifyChange(uri, null);
+		return count;
+	}
+
+	@Override
+	public String getType(Uri uri) {
+		switch (sUriMatcher.match(uri)) {
+		case USERS:
+			return Beem.Users.CONTENT_TYPE;
+
+		case USER_ID:
+			return Beem.Users.CONTENT_ITEM_TYPE;
+
+		default:
+			throw new IllegalArgumentException("Unknown URI " + uri);
+		}
+	}
+
+	@Override
+	public Uri insert(Uri uri, ContentValues initialValues) {
+        // Validate the requested uri
+        if (sUriMatcher.match(uri) != USERS) {
+            throw new IllegalArgumentException("Unknown URI " + uri);
+        }
+
+        ContentValues values;
+        if (initialValues != null) {
+            values = new ContentValues(initialValues);
+        } else {
+            values = new ContentValues();
+        }
+
+        Long now = Long.valueOf(System.currentTimeMillis());
+
+        // Make sure that the fields are all set
+        if (values.containsKey(Beem.Users.JUSERNAME) == false) {
+            throw new SQLException("No JUSERNAME specified. Failed to insert row into " + uri);
+        }
+        
+        if (values.containsKey(Beem.Users.DATE_CREATED) == false) {
+            values.put(Beem.Users.DATE_CREATED, now);
+        }
+
+        if (values.containsKey(Beem.Users.DATE_MODIFIED) == false) {
+            values.put(Beem.Users.DATE_MODIFIED, now);
+        }
+
+        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+        long rowId = db.insert(Beem.USERS_TABLE_NAME, Beem.Users._ID, values);
+        if (rowId > 0) {
+            Uri userUri = ContentUris.withAppendedId(Beem.Users.CONTENT_URI, rowId);
+            getContext().getContentResolver().notifyChange(userUri, null);
+            return userUri;
+        }
+
+        throw new SQLException("Failed to insert row into " + uri);
+	}
+
+	@Override
+	public boolean onCreate() {
+		mOpenHelper = new BeemDatabaseHelper(getContext(), TAG, Beem.USERS_TABLE_NAME, Beem.Users.QUERY_CREATE);
+		return true;
+	}
+
+	@Override
+	public Cursor query(Uri uri, String[] projection, String selection,
+			String[] selectionArgs, String sortOrder) {
+		SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
+
+		switch (sUriMatcher.match(uri)) {
+		case USERS:
+			qb.setTables(Beem.USERS_TABLE_NAME);
+			qb.setProjectionMap(sUsersProjectionMap);
+			break;
+
+		case USER_ID:
+			qb.setTables(Beem.USERS_TABLE_NAME);
+			qb.setProjectionMap(sUsersProjectionMap);
+			qb.appendWhere(Beem.Users._ID + "=" + uri.getPathSegments().get(1));
+			break;
+
+		default:
+			throw new IllegalArgumentException("Unknown URI " + uri);        
+		}
+
+		// If no sort order is specified use the default
+		String orderBy;
+		if (TextUtils.isEmpty(sortOrder)) {
+			orderBy = Beem.Users.DEFAULT_SORT_ORDER;
+		} else {
+			orderBy = sortOrder;
+		}
+
+		// Get the database and run the query
+		SQLiteDatabase db = mOpenHelper.getReadableDatabase();
+		Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy);
+
+		// Tell the cursor what uri to watch, so it knows when its source data changes
+		c.setNotificationUri(getContext().getContentResolver(), uri);
+		return c;
+	}
+
+	@Override
+	public int update(Uri uri, ContentValues values, String selection,
+			String[] selectionArgs) {
+        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+        int count;
+        
+        switch (sUriMatcher.match(uri)) {
+        case USERS:
+            count = db.update(Beem.USERS_TABLE_NAME, values, selection, selectionArgs);
+            break;
+
+        case USER_ID:
+            String userId = uri.getPathSegments().get(1);
+            count = db.update(Beem.USERS_TABLE_NAME, values, Beem.Users._ID + "=" + userId
+                    + (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : ""), selectionArgs);
+            break;
+
+        default:
+            throw new IllegalArgumentException("Unknown URI " + uri);
+        }
+
+        getContext().getContentResolver().notifyChange(uri, null);
+        return count;
+	}
+
+	static {
+		sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
+		sUriMatcher.addURI(Beem.AUTHORITY, "users", USERS);
+		sUriMatcher.addURI(Beem.AUTHORITY, "users/#", USER_ID);
+
+		sUsersProjectionMap = new HashMap<String, String>();
+		sUsersProjectionMap.put(Beem.Users._ID, Beem.Users._ID);
+		sUsersProjectionMap.put(Beem.Users.JUSERNAME, Beem.Users.JUSERNAME);
+		sUsersProjectionMap.put(Beem.Users.DATE_CREATED, Beem.Users.DATE_CREATED);
+		sUsersProjectionMap.put(Beem.Users.DATE_MODIFIED, Beem.Users.DATE_MODIFIED);
+	}
+}