/actionslib/src/com/google/android/marvin/commands/providers/CommandsContentProvider.java

http://eyes-free.googlecode.com/ · Java · 221 lines · 183 code · 29 blank · 9 comment · 11 complexity · 0d2d50f2141429f3ae348ad878c387f1 MD5 · raw file

  1. // Copyright 2010 Google Inc. All Rights Reserved.
  2. package com.google.android.marvin.commands.providers;
  3. import com.google.android.marvin.commands.CommandsManager;
  4. import com.google.android.marvin.commands.UtilityCommands;
  5. import android.content.ContentProvider;
  6. import android.content.ContentUris;
  7. import android.content.ContentValues;
  8. import android.content.Context;
  9. import android.content.UriMatcher;
  10. import android.database.Cursor;
  11. import android.database.SQLException;
  12. import android.database.sqlite.SQLiteDatabase;
  13. import android.database.sqlite.SQLiteOpenHelper;
  14. import android.database.sqlite.SQLiteQueryBuilder;
  15. import android.net.Uri;
  16. import android.util.Log;
  17. import java.util.HashMap;
  18. import java.util.Map;
  19. /**
  20. * @author clsimon@google.com (Cheryl Simon)
  21. *
  22. */
  23. public class CommandsContentProvider extends ContentProvider {
  24. // debugging support
  25. private static final String TAG = "CommandsContentProvider";
  26. private static final String DATABASE_NAME = "commands.db";
  27. private static final String COMMANDS_TABLE = "commands";
  28. private static final int COMMANDS = 1;
  29. private static final UriMatcher sUriMatcher;
  30. private static final Map<String, String> sProjectionMap;
  31. static {
  32. sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
  33. sUriMatcher.addURI(CommandsManager.AUTHORITY, COMMANDS_TABLE, COMMANDS);
  34. sProjectionMap = new HashMap<String, String>();
  35. sProjectionMap.put(CommandsManager.NAME_COLUMN, CommandsManager.NAME_COLUMN);
  36. sProjectionMap.put(CommandsManager.MODIFIER_KEY_COLUMN,
  37. CommandsManager.MODIFIER_KEY_COLUMN);
  38. sProjectionMap.put(CommandsManager.KEY_CODE_COLUMN, CommandsManager.KEY_CODE_COLUMN);
  39. sProjectionMap.put(CommandsManager.ACTION_COLUMN, CommandsManager.ACTION_COLUMN);
  40. }
  41. private static class DatabaseHelper extends SQLiteOpenHelper {
  42. public DatabaseHelper(Context context) {
  43. super(context, DATABASE_NAME, null, 1);
  44. }
  45. @Override
  46. public void onCreate(SQLiteDatabase db) {
  47. StringBuilder builder = new StringBuilder();
  48. builder.append("CREATE TABLE ");
  49. builder.append(COMMANDS_TABLE);
  50. builder.append(" (");
  51. builder.append("_id INTEGER PRIMARY KEY AUTOINCREMENT");
  52. builder.append(", ");
  53. builder.append(CommandsManager.NAME_COLUMN);
  54. builder.append(" TEXT");
  55. builder.append(", ");
  56. builder.append(CommandsManager.MODIFIER_KEY_COLUMN);
  57. builder.append(" INTEGER");
  58. builder.append(", ");
  59. builder.append(CommandsManager.KEY_CODE_COLUMN);
  60. builder.append(" INTEGER");
  61. builder.append(", ");
  62. builder.append(CommandsManager.ACTION_COLUMN);
  63. builder.append(" TEXT)");
  64. db.execSQL(builder.toString());
  65. initContent(db);
  66. }
  67. @Override
  68. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  69. Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
  70. + newVersion + ", which will destroy all old data");
  71. db.execSQL("DROP TABLE IF EXISTS " + COMMANDS_TABLE);
  72. onCreate(db);
  73. }
  74. /**
  75. * Initialize the database with the command entries from UserCommands.
  76. */
  77. private void initContent(SQLiteDatabase db) {
  78. for (UtilityCommands command : UtilityCommands.values()) {
  79. ContentValues values = new ContentValues();
  80. values.put(CommandsManager.NAME_COLUMN, command.getDisplayName());
  81. values.put(CommandsManager.MODIFIER_KEY_COLUMN, command.getModifier());
  82. values.put(CommandsManager.KEY_CODE_COLUMN, command.getKeyCode());
  83. values.put(CommandsManager.ACTION_COLUMN, command.getAction());
  84. db.insert(COMMANDS_TABLE, CommandsManager.NAME_COLUMN, values);
  85. }
  86. }
  87. }
  88. private DatabaseHelper mDatabaseHelper;
  89. @Override
  90. public int delete(Uri uri, String selection, String[] selectionArgs) {
  91. try {
  92. SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
  93. int count = 0;
  94. switch (sUriMatcher.match(uri)) {
  95. case COMMANDS:
  96. count = db.delete(COMMANDS_TABLE, selection, selectionArgs);
  97. break;
  98. default:
  99. throw new IllegalArgumentException("Unknown Uri " + uri);
  100. }
  101. getContext().getContentResolver().notifyChange(uri, null);
  102. return count;
  103. } catch (SQLException e) {
  104. Log.e(TAG, "Failed to access database.", e);
  105. return 0;
  106. }
  107. }
  108. @Override
  109. public String getType(Uri uri) {
  110. switch (sUriMatcher.match(uri)) {
  111. case COMMANDS:
  112. return "vnd.android.cursor.item/vnd.google.commands";
  113. default:
  114. throw new IllegalArgumentException("Unknown Uri " + uri);
  115. }
  116. }
  117. @Override
  118. public Uri insert(Uri uri, ContentValues initialValues) {
  119. try {
  120. if (sUriMatcher.match(uri) != COMMANDS) {
  121. throw new IllegalArgumentException("Unknown URI " + uri);
  122. }
  123. ContentValues values;
  124. if (initialValues != null) {
  125. values = new ContentValues(initialValues);
  126. } else {
  127. values = new ContentValues();
  128. }
  129. SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
  130. long rowId = db.insert(COMMANDS_TABLE, CommandsManager.NAME_COLUMN, values);
  131. if (rowId > 0) {
  132. Uri noteUri = ContentUris.withAppendedId(CommandsManager.CONTENT_URI, rowId);
  133. getContext().getContentResolver().notifyChange(noteUri, null);
  134. return noteUri;
  135. }
  136. } catch (SQLException e) {
  137. Log.e(TAG, "Failed to insert row into " + uri, e);
  138. }
  139. return null;
  140. }
  141. @Override
  142. public boolean onCreate() {
  143. try {
  144. mDatabaseHelper = new DatabaseHelper(getContext());
  145. } catch (SQLException e) {
  146. Log.e(TAG, "Failed to access database.", e);
  147. return false;
  148. }
  149. return true;
  150. }
  151. @Override
  152. public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
  153. String sortOrder) {
  154. try {
  155. SQLiteQueryBuilder builder = new SQLiteQueryBuilder();
  156. switch (sUriMatcher.match(uri)) {
  157. case COMMANDS:
  158. builder.setTables(COMMANDS_TABLE);
  159. builder.setProjectionMap(sProjectionMap);
  160. break;
  161. default:
  162. throw new IllegalArgumentException("Unknown Uri " + uri);
  163. }
  164. SQLiteDatabase db = mDatabaseHelper.getReadableDatabase();
  165. Cursor c = builder.query(db, projection, selection, selectionArgs, null, null, sortOrder);
  166. c.setNotificationUri(getContext().getContentResolver(), uri);
  167. return c;
  168. } catch (SQLException e) {
  169. Log.e(TAG, "Failed to access database.", e);
  170. return null;
  171. }
  172. }
  173. @Override
  174. public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
  175. try {
  176. SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
  177. int count;
  178. switch (sUriMatcher.match(uri)) {
  179. case COMMANDS:
  180. count = db.update(COMMANDS_TABLE, values, selection, selectionArgs);
  181. break;
  182. default:
  183. throw new IllegalArgumentException("Unknown Uri " + uri);
  184. }
  185. getContext().getContentResolver().notifyChange(uri, null);
  186. return count;
  187. } catch (SQLException e) {
  188. Log.e(TAG, "Failed to access database.", e);
  189. return 0;
  190. }
  191. }
  192. }