/**
* Copyright (C) 2013 by Raphael Michel under the MIT license:
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the Software
* is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
package de.geeksfactory.opacclient.storage;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import java.util.List;
import de.geeksfactory.opacclient.BuildConfig;
public class StarContentProvider extends ContentProvider {
public static final String STAR_TYPE = "star";
private static final String STAR_MIME_POSTFIX = "/vnd.de.opacapp.type"
+ STAR_TYPE;
public static final String AUTHORITY = BuildConfig.APPLICATION_ID + ".starprovider";
public static final String BASE_URI = "content://" + AUTHORITY + "/";
public static final Uri STAR_URI = Uri.parse(BASE_URI + STAR_TYPE);
private static final String MIME_PREFIX = "vnd.android.cursor.";
private static final String STAR_DIR_MIME = MIME_PREFIX + "dir"
+ STAR_MIME_POSTFIX;
private static final String STAR_ITEM_MIME = MIME_PREFIX + "item"
+ STAR_MIME_POSTFIX;
private StarDatabase database;
private static Mime getTypeMime(Uri uri) {
if (!AUTHORITY.equals(uri.getAuthority())
&& !uri.getAuthority().startsWith("de.opacapp.")
&& !uri.getAuthority().startsWith("net.opacapp.")) {
return null;
}
List<String> segments = uri.getPathSegments();
if (segments == null || segments.size() == 0) {
return null;
}
String type = segments.get(0);
if (STAR_TYPE.equals(type)) {
switch (segments.size()) {
case 1:
return Mime.STAR_DIR;
case 2:
return Mime.STAR_ITEM;
default:
return null;
}
} else {
return null;
}
}
@Override
public boolean onCreate() {
database = new StarDatabase(getContext());
return true;
}
@Override
public String getType(Uri uri) {
switch (getTypeMime(uri)) {
case STAR_DIR:
return STAR_DIR_MIME;
case STAR_ITEM:
return STAR_ITEM_MIME;
default:
return null;
}
}
private int deleteInDatabase(String table, String whereClause,
String[] whereArgs) {
return database.getWritableDatabase().delete(table, whereClause, whereArgs);
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int rowsAffected;
switch (getTypeMime(uri)) {
case STAR_DIR:
rowsAffected = deleteInDatabase(StarDatabase.STAR_TABLE, selection, selectionArgs);
break;
case STAR_ITEM:
rowsAffected = deleteInDatabase(StarDatabase.STAR_TABLE,
StarDatabase.STAR_WHERE_ID, selectionForUri(uri));
break;
default:
rowsAffected = 0;
break;
}
if (rowsAffected > 0) {
notifyUri(uri);
}
return rowsAffected;
}
private long insertIntoDatabase(String table, ContentValues values) {
return database.getWritableDatabase()
.insertOrThrow(table, null, values);
}
@Override
public Uri insert(Uri uri, ContentValues values) {
Uri itemUri;
long id;
switch (getTypeMime(uri)) {
case STAR_DIR:
id = insertIntoDatabase(StarDatabase.STAR_TABLE, values);
itemUri = ContentUris.withAppendedId(STAR_URI, id);
notifyUri(STAR_URI);
break;
case STAR_ITEM:
default:
itemUri = null;
break;
}
if (itemUri != null) {
notifyUri(uri);
}
return itemUri;
}
private Cursor queryDatabase(String table, String[] projection,
String selection, String[] selectionArgs, String groupBy,
String having, String orderBy) {
return database.getReadableDatabase().query(table, projection,
selection, selectionArgs, groupBy, having, orderBy);
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
Cursor cursor;
switch (getTypeMime(uri)) {
case STAR_DIR:
cursor = queryDatabase(StarDatabase.STAR_TABLE, projection,
selection, selectionArgs, null, null, sortOrder);
break;
case STAR_ITEM:
cursor = queryDatabase(StarDatabase.STAR_TABLE, projection,
StarDatabase.STAR_WHERE_ID, selectionForUri(uri), null,
null, sortOrder);
break;
default:
return null;
}
cursor.setNotificationUri(getContext().getContentResolver(), uri);
return cursor;
}
private int updateInDatabase(String table, ContentValues values,
String selection, String[] selectionArgs) {
return database.getWritableDatabase().update(table, values, selection,
selectionArgs);
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
int rowsAffected;
switch (getTypeMime(uri)) {
case STAR_DIR:
rowsAffected = updateInDatabase(StarDatabase.STAR_TABLE, values,
selection, selectionArgs);
break;
case STAR_ITEM:
rowsAffected = updateInDatabase(StarDatabase.STAR_TABLE, values,
StarDatabase.STAR_WHERE_ID, selectionForUri(uri));
break;
default:
rowsAffected = 0;
break;
}
if (rowsAffected > 0) {
notifyUri(uri);
}
return rowsAffected;
}
private void notifyUri(Uri uri) {
getContext().getContentResolver().notifyChange(uri, null);
}
private String[] selectionForUri(Uri uri) {
return new String[]{String.valueOf(ContentUris.parseId(uri))};
}
private enum Mime {
STAR_ITEM, STAR_DIR
}
}