/*
* Copyright (C) 2012 The CyanogenMod Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.cyanogenmod.filemanager.providers;
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;
import android.util.Log;
import com.cyanogenmod.filemanager.model.Bookmark;
import com.cyanogenmod.filemanager.preferences.BookmarksDatabaseHelper;
/**
* A content provider for manage the user-defined bookmarks
*/
public class BookmarksContentProvider extends ContentProvider {
private static final boolean DEBUG = false;
private static final String TAG = "BookmarksContentProvider"; //$NON-NLS-1$
private BookmarksDatabaseHelper mOpenHelper;
private static final int BOOKMARKS = 1;
private static final int BOOKMARKS_ID = 2;
/**
* The authority string name.
*/
public static final String AUTHORITY =
"com.cyanogenmod.filemanager.providers.bookmarks"; //$NON-NLS-1$
private static final UriMatcher sURLMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static {
sURLMatcher.addURI(
AUTHORITY,
"bookmarks", BOOKMARKS); //$NON-NLS-1$
sURLMatcher.addURI(
AUTHORITY,
"bookmarks/#", BOOKMARKS_ID); //$NON-NLS-1$
}
/**
* Constructor of <code>BookmarksContentProvider</code>.
*/
public BookmarksContentProvider() {
super();
}
/**
* {@inheritDoc}
*/
@Override
public boolean onCreate() {
this.mOpenHelper = new BookmarksDatabaseHelper(getContext());
return true;
}
/**
* {@inheritDoc}
*/
@Override
public Cursor query(Uri url, String[] projectionIn, String selection,
String[] selectionArgs, String sort) {
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
// Generate the body of the query
int match = sURLMatcher.match(url);
switch (match) {
case BOOKMARKS:
qb.setTables("bookmarks"); //$NON-NLS-1$
break;
case BOOKMARKS_ID:
qb.setTables("bookmarks"); //$NON-NLS-1$
qb.appendWhere("_id="); //$NON-NLS-1$
qb.appendWhere(url.getPathSegments().get(1));
break;
default:
throw new IllegalArgumentException("Unknown URL " + url); //$NON-NLS-1$
}
// Open the database
SQLiteDatabase db = this.mOpenHelper.getReadableDatabase();
Cursor cursor = qb.query(db, projectionIn, selection, selectionArgs,
null, null, sort);
if (cursor == null) {
if (DEBUG) {
Log.v(TAG, "Bookmarks.query: failed"); //$NON-NLS-1$
}
} else {
cursor.setNotificationUri(getContext().getContentResolver(), url);
}
return cursor;
}
/**
* {@inheritDoc}
*/
@Override
public String getType(Uri url) {
int match = sURLMatcher.match(url);
switch (match) {
case BOOKMARKS:
return "vnd.android.cursor.dir/bookmarks"; //$NON-NLS-1$
case BOOKMARKS_ID:
return "vnd.android.cursor.item/bookmarks"; //$NON-NLS-1$
default:
throw new IllegalArgumentException("Unknown URL"); //$NON-NLS-1$
}
}
/**
* {@inheritDoc}
*/
@Override
public int update(Uri url, ContentValues values, String where, String[] whereArgs) {
int count;
long rowId = 0;
int match = sURLMatcher.match(url);
SQLiteDatabase db = this.mOpenHelper.getWritableDatabase();
switch (match) {
case BOOKMARKS_ID: {
String segment = url.getPathSegments().get(1);
rowId = Long.parseLong(segment);
count = db.update(
"bookmarks", values, "_id=" + rowId, null); //$NON-NLS-1$ //$NON-NLS-2$
break;
}
default: {
throw new UnsupportedOperationException(
"Cannot update URL: " + url); //$NON-NLS-1$
}
}
if (DEBUG) {
Log.v(TAG,
"*** notifyChange() rowId: " + //$NON-NLS-1$
rowId + " url " + url); //$NON-NLS-1$
}
getContext().getContentResolver().notifyChange(url, null);
return count;
}
/**
* {@inheritDoc}
*/
@Override
public Uri insert(Uri url, ContentValues initialValues) {
if (sURLMatcher.match(url) != BOOKMARKS) {
throw new IllegalArgumentException("Cannot insert into URL: " + url); //$NON-NLS-1$
}
// Add the bookmark
SQLiteDatabase db = this.mOpenHelper.getWritableDatabase();
long rowId = db.insert("bookmarks", null, initialValues); //$NON-NLS-1$
if (rowId < 0) {
throw new SQLException("Failed to insert row"); //$NON-NLS-1$
}
if (DEBUG) {
Log.v(TAG, "Added bookmark rowId = " + rowId); //$NON-NLS-1$
}
Uri newUrl = ContentUris.withAppendedId(Bookmark.Columns.CONTENT_URI, rowId);
// Notify changes
getContext().getContentResolver().notifyChange(newUrl, null);
return newUrl;
}
/**
* {@inheritDoc}
*/
@Override
public int delete(Uri url, String where, String[] whereArgs) {
SQLiteDatabase db = this.mOpenHelper.getWritableDatabase();
int count;
String whereQuery = where;
switch (sURLMatcher.match(url)) {
case BOOKMARKS:
count = db.delete("bookmarks", whereQuery, whereArgs); //$NON-NLS-1$
break;
case BOOKMARKS_ID:
String segment = url.getPathSegments().get(1);
if (TextUtils.isEmpty(whereQuery)) {
whereQuery = "_id=" + segment; //$NON-NLS-1$
} else {
whereQuery = "_id=" + segment + //$NON-NLS-1$
" AND (" + whereQuery + ")"; //$NON-NLS-1$ //$NON-NLS-2$
}
count = db.delete("bookmarks", whereQuery, whereArgs); //$NON-NLS-1$
break;
default:
throw new IllegalArgumentException("Cannot delete from URL: " + url); //$NON-NLS-1$
}
getContext().getContentResolver().notifyChange(url, null);
return count;
}
}