package com.gh4a.db; import android.content.ContentProvider; import android.content.ContentResolver; 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.SQLiteQueryBuilder; import android.net.Uri; import android.provider.BaseColumns; import android.support.annotation.NonNull; import android.util.Log; import android.widget.Toast; import com.gh4a.R; public class BookmarksProvider extends ContentProvider { private static final String TAG = "BookmarksProvider"; public interface Columns extends BaseColumns { Uri CONTENT_URI = Uri.parse("content://com.gh4a/bookmarks"); String NAME = "name"; String TYPE = "type"; String URI = "uri"; String EXTRA = "extra_data"; int TYPE_USER = 0; int TYPE_REPO = 1; } private static final int MATCH_ALL = 0; private static final int MATCH_ID = 1; private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH); static { sURIMatcher.addURI("com.gh4a", "bookmarks", MATCH_ALL); sURIMatcher.addURI("com.gh4a", "bookmarks/#", MATCH_ID); } private DbHelper mDbHelper; // url must be resolvable by BrowseFilter! public static void saveBookmark(Context context, String name, int type, String url, String extraData) { ContentResolver cr = context.getContentResolver(); ContentValues cv = new ContentValues(); cv.put(BookmarksProvider.Columns.NAME, name); cv.put(BookmarksProvider.Columns.TYPE, type); cv.put(BookmarksProvider.Columns.URI, url); cv.put(BookmarksProvider.Columns.EXTRA, extraData); if (cr.insert(BookmarksProvider.Columns.CONTENT_URI, cv) != null) { Toast.makeText(context, R.string.bookmark_saved, Toast.LENGTH_LONG).show(); } } public static void removeBookmark(Context context, String url) { int removedRows = context.getContentResolver().delete(Columns.CONTENT_URI, Columns.URI + " = ?", new String[] { url }); if (removedRows > 0) { Toast.makeText(context, R.string.bookmark_removed, Toast.LENGTH_SHORT).show(); } } public static boolean hasBookmarked(Context context, String url) { Cursor cursor = context.getContentResolver().query(Columns.CONTENT_URI, new String[] { Columns._ID }, Columns.URI + " = ?", new String[] { url }, null); boolean hasBookmarked = false; if (cursor != null) { hasBookmarked = cursor.getCount() > 0; cursor.close(); } return hasBookmarked; } @Override public boolean onCreate() { mDbHelper = new DbHelper(getContext()); return true; } @Override public Cursor query(@NonNull Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); int match = sURIMatcher.match(uri); qb.setTables(DbHelper.BOOKMARKS_TABLE); switch (match) { case MATCH_ALL: break; case MATCH_ID: qb.appendWhere(Columns._ID + " = " + uri.getLastPathSegment()); break; default: Log.e(TAG, "query: invalid request: " + uri); return null; } if (sortOrder == null) { sortOrder = Columns.TYPE + " asc"; } SQLiteDatabase db = mDbHelper.getReadableDatabase(); Cursor ret = qb.query(db, projection, selection, selectionArgs, null, null, sortOrder); ret.setNotificationUri(getContext().getContentResolver(), uri); return ret; } @Override public String getType(@NonNull Uri uri) { return null; } @Override public Uri insert(@NonNull Uri uri, ContentValues values) { if (sURIMatcher.match(uri) != MATCH_ALL) { return null; } SQLiteDatabase db = mDbHelper.getWritableDatabase(); long rowID = db.insert(DbHelper.BOOKMARKS_TABLE, null, values); if (rowID <= 0) { return null; } getContext().getContentResolver().notifyChange(Columns.CONTENT_URI, null); return ContentUris.withAppendedId(Columns.CONTENT_URI, rowID); } @Override public int update(@NonNull Uri uri, ContentValues values, String selection, String[] selectionArgs) { int count; int match = sURIMatcher.match(uri); SQLiteDatabase db = mDbHelper.getWritableDatabase(); switch (match) { case MATCH_ALL: count = db.update(DbHelper.BOOKMARKS_TABLE, values, selection, selectionArgs); break; case MATCH_ID: if (selection != null || selectionArgs != null) { throw new UnsupportedOperationException( "Cannot update URI " + uri + " with a where clause"); } count = db.update(DbHelper.BOOKMARKS_TABLE, values, Columns._ID + " = ?", new String[] { uri.getLastPathSegment() }); break; default: throw new UnsupportedOperationException("Cannot update that URI: " + uri); } if (count > 0) { getContext().getContentResolver().notifyChange(Columns.CONTENT_URI, null); } return count; } @Override public int delete(@NonNull Uri uri, String selection, String[] selectionArgs) { int match = sURIMatcher.match(uri); SQLiteDatabase db = mDbHelper.getWritableDatabase(); switch (match) { case MATCH_ALL: break; case MATCH_ID: if (selection != null || selectionArgs != null) { throw new UnsupportedOperationException( "Cannot delete URI " + uri + " with a where clause"); } selection = Columns._ID + " = ?"; selectionArgs = new String[] { uri.getLastPathSegment() }; break; default: throw new UnsupportedOperationException("Cannot delete the URI " + uri); } int count = db.delete(DbHelper.BOOKMARKS_TABLE, selection, selectionArgs); if (count > 0) { getContext().getContentResolver().notifyChange(Columns.CONTENT_URI, null); } return count; } }