package org.openintents.filemanager.bookmarks; 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.SQLException; 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; public class BookmarksProvider extends ContentProvider implements BaseColumns{ public static final String TB_NAME = "bookmarks"; public static final String NAME = "name"; public static final String PATH = "path"; public static final String CHECKED = "checked"; //Only because of multiple choice delete dialog public static final String PROVIDER_NAME = "org.openintents.filemanager.bookmarks"; public static final Uri CONTENT_URI = Uri.parse("content://"+PROVIDER_NAME); public static final String BOOKMARK_MIMETYPE = "vnd.android.cursor.item/vnd.openintents.bookmark"; public static final String BOOKMARKS_MIMETYPE = "vnd.android.cursor.dir/vnd.openintents.bookmark"; private static final int BOOKMARKS = 1; private static final int BOOKMARK_ID = 2; private static final UriMatcher uriMatcher; static{ uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); uriMatcher.addURI(PROVIDER_NAME, null, BOOKMARKS); uriMatcher.addURI(PROVIDER_NAME, "#", BOOKMARK_ID); } private DatabaseHelper dbHelper; private SQLiteDatabase db; private static final String DATABASE_CREATE = String.format("CREATE TABLE %s (%s integer primary key autoincrement, " + "%s text not null, %s text not null, %s integer default 0);", TB_NAME, _ID, NAME, PATH, CHECKED); private static final String DATABASE_NAME = "org.openintents.filemanager"; private static final int DATABASE_VERSION = 2; private static class DatabaseHelper extends SQLiteOpenHelper { DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(DATABASE_CREATE); } /* * !!! * When changing database version, you MUST change this method. * Currently, it would delete all users' bookmarks */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS "+TB_NAME); onCreate(db); } } @Override public int delete(Uri arg0, String arg1, String[] arg2) { int count; switch (uriMatcher.match(arg0)) { case BOOKMARKS: count = db.delete(TB_NAME, arg1, arg2); break; case BOOKMARK_ID: String id = arg0.getPathSegments().get(0); count = db.delete(TB_NAME, _ID + " = " + id + (!TextUtils.isEmpty(arg1) ? " AND (" + arg1 + ')' : ""), arg2); break; default: throw new IllegalArgumentException("Unknown URI " + arg0); } getContext().getContentResolver().notifyChange(arg0, null); return count; } @Override public String getType(Uri uri) { switch (uriMatcher.match(uri)){ case BOOKMARKS: return BOOKMARKS_MIMETYPE; case BOOKMARK_ID: return BOOKMARK_MIMETYPE; default: throw new IllegalArgumentException("Unsupported URI: " + uri); } } @Override public Uri insert(Uri uri, ContentValues values){ long rowID = db.insert(TB_NAME, "", values); if (rowID > 0){ Uri _uri = ContentUris.withAppendedId(CONTENT_URI, rowID); getContext().getContentResolver().notifyChange(_uri, null); return _uri; } throw new SQLException("Failed to insert row into " + uri); } @Override public boolean onCreate() { dbHelper = new DatabaseHelper(getContext()); db = dbHelper.getWritableDatabase(); return (db == null)? false:true; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { SQLiteQueryBuilder sqlBuilder = new SQLiteQueryBuilder(); sqlBuilder.setTables(TB_NAME); if (uriMatcher.match(uri) == BOOKMARK_ID){ sqlBuilder.appendWhere(_ID + " = " + uri.getPathSegments().get(0)); } if (sortOrder==null || sortOrder=="") sortOrder = _ID; Cursor c = sqlBuilder.query(db, projection, selection, selectionArgs, null, null, sortOrder); c.setNotificationUri(getContext().getContentResolver(), uri); return c; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { int count; switch (uriMatcher.match(uri)){ case BOOKMARKS: count = db.update( TB_NAME, values, selection, selectionArgs); break; case BOOKMARK_ID: count = db.update( TB_NAME, values, _ID + " = " + uri.getPathSegments().get(0) + (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : ""), selectionArgs); break; default: throw new IllegalArgumentException("Unknown URI " + uri); } getContext().getContentResolver().notifyChange(uri, null); return count; } }