package by.istin.android.xcore.utils;
import android.annotation.TargetApi;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.DatabaseUtils;
import android.database.MatrixCursor;
import android.net.Uri;
import android.os.Build;
import android.provider.BaseColumns;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import by.istin.android.xcore.provider.ModelContract;
@SuppressWarnings("unchecked")
public class ContentUtils {
public static ContentValues getEntity(Context context, Class<?> entityClass, Long id, String ... projection) {
Uri uri = ModelContract.getUri(entityClass, id);
return getEntity(context, uri, projection);
}
public static ContentValues getEntity(Context context, Uri uri, String ... projection) {
return getEntity(context, uri, projection, null, null);
}
public static ContentValues getEntity(Context context, Uri uri, String[] projection, String selection, String[] selectionArgs) {
Cursor entityCursor = null;
ContentValues values = null;
try {
entityCursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
if (!CursorUtils.isEmpty(entityCursor) && entityCursor.moveToFirst()) {
values = new ContentValues();
DatabaseUtils.cursorRowToContentValues(entityCursor, values);
}
} finally {
CursorUtils.close(entityCursor);
}
return values;
}
public static void putEntity(Context context, Class<?> entityClass, ContentValues entity) {
context.getContentResolver().insert(ModelContract.getUri(entityClass), entity);
}
public static void putEntities(Context context, Class<?> entityClass, List<ContentValues> entities) {
if (entities == null) return;
putEntities(context, entityClass, entities.toArray(new ContentValues[entities.size()]));
}
public static void putEntities(Context context, Class<?> entityClass, ContentValues... entity) {
context.getContentResolver().bulkInsert(ModelContract.getUri(entityClass), entity);
}
public static void removeEntity(Context context, Class<?> entityClass, long id) {
String where = BaseColumns._ID + "=?";
removeEntities(context, entityClass, where, String.valueOf(id));
}
public static void removeEntities(Context context, Class<?> entityClass, String where, String ... selectionArgs) {
Uri uri = ModelContract.getUri(entityClass);
removeEntities(context, uri, where, selectionArgs);
}
public static void removeEntities(Context context, Uri uri, String where, String[] selectionArgs) {
context.getContentResolver().delete(uri, where, selectionArgs);
}
public static ContentValues getEntity(Context context, Class<?> entityClass, String selection, String ... selectionArgs) {
List<ContentValues> entities = getEntities(context, entityClass, selection, selectionArgs);
if (entities == null || entities.isEmpty()) {
return null;
}
return entities.get(0);
}
public static ContentValues getEntity(Context context, Class<?> entityClass, String[] projection, String selection, String ... selectionArgs) {
List<ContentValues> entities = getEntities(context, projection, entityClass, selection, selectionArgs);
if (entities == null || entities.isEmpty()) {
return null;
}
return entities.get(0);
}
public static List<ContentValues> getEntitiesWithOrder(Context context, Class<?> entityClass, String sortOrder, String selection, String... selectionArgs) {
Uri uri = ModelContract.getUri(entityClass);
return getEntities(context, uri, sortOrder, selection, selectionArgs);
}
public static List<ContentValues> getEntitiesFromSQL(Context context, String sql, String ... args) {
Uri uri = ModelContract.getSQLQueryUri(sql, null);
return getEntities(context, uri, null, null, args);
}
public static List<ContentValues> getEntities(Context context, String[] projection, Uri uri, String sortOrder, String selection, String[] selectionArgs) {
Cursor entityCursor = null;
List<ContentValues> result = null;
try {
entityCursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder);
if (!CursorUtils.isEmpty(entityCursor) && entityCursor.moveToFirst()) {
result = new ArrayList<ContentValues>();
CursorUtils.convertToContentValuesAndClose(entityCursor, result);
}
} finally {
CursorUtils.close(entityCursor);
}
return result;
}
public static List<ContentValues> getEntities(Context context, Uri uri, String sortOrder, String selection, String[] selectionArgs) {
return getEntities(context, null, uri, sortOrder, selection, selectionArgs);
}
public static List<ContentValues> getEntities(Context context, String[] projection, Class<?> entityClass, String selection, String ... selectionArgs) {
return getEntities(context, projection, ModelContract.getUri(entityClass), null, selection, selectionArgs);
}
public static List<ContentValues> getEntities(Context context, Class<?> entityClass, String selection, String ... selectionArgs) {
return getEntitiesWithOrder(context, entityClass, null, selection, selectionArgs);
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static Set<String> getKeys(ContentValues contentValues) {
if (UiUtil.hasHoneycomb()) {
return contentValues.keySet();
} else {
Set<Map.Entry<String, Object>> entries = contentValues.valueSet();
Set set = new HashSet();
for (Map.Entry<String, Object> objectEntry : entries) {
set.add(objectEntry.getKey());
}
return set;
}
}
public static Cursor listContentValuesToCursor(List<ContentValues> listContentValues, String ... defaultColumnsIfNull) {
if (listContentValues == null || listContentValues.isEmpty()) {
if (defaultColumnsIfNull == null) {
defaultColumnsIfNull = new String[]{};
}
return new MatrixCursor(defaultColumnsIfNull);
}
ContentValues contentValues = listContentValues.get(0);
Set<String> keys = getKeys(contentValues);
String[] columns = new String[keys.size()];
columns = keys.toArray(columns);
MatrixCursor matrixCursor = new MatrixCursor(columns);
for (ContentValues values : listContentValues) {
Object[] objects = new Object[columns.length];
for (int i = 0; i < columns.length; i++) {
objects[i] = values.get(columns[i]);
}
matrixCursor.addRow(objects);
}
return matrixCursor;
}
}