package com.mcxiaoke.minicat.controller;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.CursorLoader;
import android.content.Loader;
import android.database.Cursor;
import android.net.Uri;
import android.provider.BaseColumns;
import android.text.TextUtils;
import android.util.Log;
import com.mcxiaoke.minicat.AppContext;
import com.mcxiaoke.minicat.dao.DataProvider;
import com.mcxiaoke.minicat.dao.model.BaseModel;
import com.mcxiaoke.minicat.dao.model.DirectMessageColumns;
import com.mcxiaoke.minicat.dao.model.DirectMessageModel;
import com.mcxiaoke.minicat.dao.model.IBaseColumns;
import com.mcxiaoke.minicat.dao.model.Model;
import com.mcxiaoke.minicat.dao.model.StatusColumns;
import com.mcxiaoke.minicat.dao.model.StatusModel;
import com.mcxiaoke.minicat.dao.model.StatusUpdateInfoColumns;
import com.mcxiaoke.minicat.dao.model.UserColumns;
import com.mcxiaoke.minicat.dao.model.UserModel;
import java.util.ArrayList;
import java.util.List;
/**
* @author mcxiaoke
* @version 3.1 2012.03.26
*/
public class DataController {
private static final String TAG = DataController.class.getSimpleName();
private static Uri withAppendedId(Uri baseUri, String id) {
return Uri.withAppendedPath(baseUri, "id/" + id);
}
public static int parseInt(Cursor c, String columnName) {
return c.getInt(c.getColumnIndexOrThrow(columnName));
}
public static long parseLong(Cursor c, String columnName) {
return c.getLong(c.getColumnIndexOrThrow(columnName));
}
public static String parseString(Cursor c, String columnName) {
return c.getString(c.getColumnIndexOrThrow(columnName));
}
public static boolean parseBoolean(Cursor c, String columnName) {
return c.getInt(c.getColumnIndexOrThrow(columnName)) != 0;
}
public static ContentValues[] toContentValues(
List<? extends BaseModel> models) {
if (models == null || models.size() == 0) {
return null;
}
int size = models.size();
ContentValues[] values = new ContentValues[size];
for (int i = 0; i < size; i++) {
values[i] = models.get(i).values();
}
return values;
}
public static void clearDatabase(Context context) {
ContentResolver cr = context.getContentResolver();
cr.delete(StatusColumns.CONTENT_URI, null, null);
cr.delete(UserColumns.CONTENT_URI, null, null);
cr.delete(DirectMessageColumns.CONTENT_URI, null, null);
cr.delete(StatusUpdateInfoColumns.CONTENT_URI, null, null);
}
public static void clear(Context context, Uri uri) {
context.getContentResolver().delete(uri, null, null);
}
public static int storeStatusesWithUsers(Context context,
List<StatusModel> statuses) {
if (statuses == null || statuses.size() == 0) {
return -1;
}
int size = statuses.size();
List<UserModel> users = new ArrayList<UserModel>(size);
for (StatusModel status : statuses) {
users.add(status.getUser());
}
store(context, statuses);
return store(context, users);
}
public static int store(Context context, List<? extends BaseModel> models) {
if (models == null || models.size() == 0) {
return -1;
}
if (AppContext.DEBUG) {
Log.d(TAG, "store models.size=" + models.size() + " table="
+ models.get(0).getContentUri());
}
Uri uri = models.get(0).getContentUri();
return context.getContentResolver().bulkInsert(uri,
DataController.toContentValues(models));
}
public static Uri store(Context context, Model model) {
if (model == null) {
return null;
}
return context.getContentResolver().insert(model.getContentUri(),
model.values());
}
public static boolean update(Context context, BaseModel model) {
if (model == null) {
return false;
}
String where = IBaseColumns.ID + " =? ";
String[] whereArgs = new String[]{model.getId()};
return context.getContentResolver().update(model.getContentUri(), model.values(), where, whereArgs) != -1;
}
public static int updateUserModel(Context context, final UserModel u) {
ContentValues values = new ContentValues();
values.put(IBaseColumns.TYPE, u.getType());
values.put(UserColumns.FOLLOWING, u.isFollowing());
values.put(UserColumns.STATUSES_COUNT, u.getStatusesCount());
values.put(UserColumns.FAVORITES_COUNT, u.getFavouritesCount());
values.put(UserColumns.FRIENDS_COUNT, u.getFriendsCount());
values.put(UserColumns.FOLLOWERS_COUNT, u.getFollowersCount());
values.put(UserColumns.DESCRIPTION, u.getDescription());
values.put(UserColumns.PROFILE_IMAGE_URL, u.getProfileImageUrl());
values.put(UserColumns.PROFILE_IMAGE_URL_LARGE,
u.getProfileImageUrlLarge());
return DataController.update(context, u, values);
}
public static int update(Context context, BaseModel model,
ContentValues values) {
if (model == null || values == null) {
return -1;
}
Uri uri = withAppendedId(model.getContentUri(), model.getId());
return context.getContentResolver().update(uri, values, null, null);
}
public static int delete(Context context, Uri baseUri, String id) {
Uri uri = withAppendedId(baseUri, id);
return context.getContentResolver().delete(uri, null, null);
}
public static int delete(Context context, BaseModel model) {
if (model == null) {
return -1;
}
Uri uri = withAppendedId(model.getContentUri(), model.getId());
return context.getContentResolver().delete(uri, null, null);
}
public static int deleteStatusByType(Context context, int type) {
String where = IBaseColumns.TYPE + " = ? ";
String[] whereArgs = new String[]{String.valueOf(type)};
return context.getContentResolver().delete(StatusColumns.CONTENT_URI,
where, whereArgs);
}
public static int deleteUserTimeline(Context context, String userId) {
String where = IBaseColumns.TYPE + " = ? AND " + StatusColumns.USER_ID
+ " =? ";
String[] whereArgs = new String[]{
String.valueOf(StatusModel.TYPE_USER), userId};
return context.getContentResolver().delete(StatusColumns.CONTENT_URI,
where, whereArgs);
}
public static int deleteUserFavorites(Context context, String userId) {
String where = IBaseColumns.TYPE + " = ? AND " + IBaseColumns.OWNER
+ " =? ";
String[] whereArgs = new String[]{
String.valueOf(StatusModel.TYPE_FAVORITES), userId};
return context.getContentResolver().delete(StatusColumns.CONTENT_URI,
where, whereArgs);
}
public static int deleteStatusByUserId(Context context, String userId) {
return context.getContentResolver().delete(StatusColumns.CONTENT_URI,
StatusColumns.USER_ID + " =? ", new String[]{userId});
}
public static int deleteRecord(Context context, long id) {
Uri uri = ContentUris.withAppendedId(StatusUpdateInfoColumns.CONTENT_URI, id);
return context.getContentResolver().delete(uri, null, null);
}
public static UserModel getUser(Context context, String id) {
Uri uri = withAppendedId(UserColumns.CONTENT_URI, id);
Cursor cursor = context.getContentResolver().query(uri, null, null,
null, null);
if (AppContext.DEBUG) {
Log.d(TAG,
"getUser() cursor=" + cursor + " cursor.size="
+ cursor.getCount());
}
if (cursor != null && cursor.moveToFirst()) {
UserModel um = UserModel.from(cursor);
cursor.close();
return um;
}
return null;
}
public static StatusModel getStatus(Context context, String id) {
Uri uri = withAppendedId(StatusColumns.CONTENT_URI, id);
Cursor cursor = context.getContentResolver().query(uri, null, null,
null, null);
if (cursor != null && cursor.moveToFirst()) {
StatusModel sm = StatusModel.from(cursor);
cursor.close();
return sm;
}
return null;
}
public static Cursor getHomeTimelineCursor(Context context) {
String orderBy = DataProvider.ORDERBY_RAWID_DESC;
String where = IBaseColumns.TYPE + " =? OR " + IBaseColumns.TYPE + " =? ";
String[] whereArgs = new String[]{String.valueOf(StatusModel.TYPE_HOME), String.valueOf(StatusModel.TYPE_MENTIONS)};
return context.getContentResolver().query(StatusColumns.CONTENT_URI, null, where, whereArgs, orderBy);
}
public static Cursor getDirectMessageCursor(Context context) {
String orderBy = DataProvider.ORDERBY_RAWID_DESC;
return context.getContentResolver().query(DirectMessageColumns.CONTENT_URI, null, null, null, orderBy);
}
public static CursorLoader getConversationListLoader(Activity activity) {
String where = IBaseColumns.TYPE + " =? ";
String[] whereArgs = new String[]{String
.valueOf(DirectMessageModel.TYPE_CONVERSATION_LIST)};
String orderBy = DataProvider.ORDERBY_TIME_DESC;
return new CursorLoader(activity, DirectMessageColumns.CONTENT_URI,
null, where, whereArgs, orderBy);
}
public static CursorLoader getConversationLoader(Activity activity,
String id) {
String where = IBaseColumns.TYPE + " !=? AND "
+ DirectMessageColumns.CONVERSATION_ID + " =? ";
String[] whereArgs = new String[]{
String.valueOf(DirectMessageModel.TYPE_CONVERSATION_LIST), id};
String orderBy = DataProvider.ORDERBY_TIME;
return new CursorLoader(activity, DirectMessageColumns.CONTENT_URI,
null, where, whereArgs, orderBy);
}
public static Loader<Cursor> getTimelineCursorLoader(Context context,
int type) {
String where = IBaseColumns.TYPE + " =? ";
String[] whereArgs = new String[]{String.valueOf(type)};
return new CursorLoader(context, StatusColumns.CONTENT_URI, null,
where, whereArgs, DataProvider.ORDERBY_RAWID_DESC);
}
public static Loader<Cursor> getUserTimelineCursorLoader(Context context,
String userId) {
String where = IBaseColumns.TYPE + " =? AND " + StatusColumns.USER_ID
+ " =? ";
String[] whereArgs = new String[]{
String.valueOf(StatusModel.TYPE_USER), userId};
return new CursorLoader(context, StatusColumns.CONTENT_URI, null,
where, whereArgs, DataProvider.ORDERBY_RAWID_DESC);
}
public static Loader<Cursor> getUserFavoritesCursorLoader(Context context,
String userId) {
String where = IBaseColumns.TYPE + " =? AND " + IBaseColumns.OWNER
+ " =? ";
String[] whereArgs = new String[]{
String.valueOf(StatusModel.TYPE_FAVORITES), userId};
return new CursorLoader(context, StatusColumns.CONTENT_URI, null,
where, whereArgs, DataProvider.ORDERBY_RAWID_DESC);
}
public static Loader<Cursor> getAutoCompleteCursorLoader(Context context,
String id) {
final String[] projection = new String[]{BaseColumns._ID,
IBaseColumns.ID, UserColumns.SCREEN_NAME, IBaseColumns.TYPE,
IBaseColumns.OWNER};
final String where = IBaseColumns.TYPE + " =? AND " + IBaseColumns.OWNER
+ " =? ";
final String[] whereArgs = new String[]{
String.valueOf(UserModel.TYPE_FRIENDS), id};
return new CursorLoader(context, UserColumns.CONTENT_URI, projection,
where, whereArgs, null);
}
public static Loader<Cursor> getFriendsCursorLoader(Context context,
String id) {
return getUserListCursorLoader(context, UserModel.TYPE_FRIENDS, id);
}
public static Loader<Cursor> getFollowersCursorLoader(Context context,
String id) {
return getUserListCursorLoader(context, UserModel.TYPE_FOLLOWERS, id);
}
public static Loader<Cursor> getUserListCursorLoader(Context context,
int type, String id) {
final String where = IBaseColumns.TYPE + " =? AND " + IBaseColumns.OWNER
+ " =? ";
final String[] whereArgs = new String[]{String.valueOf(type), id};
return new CursorLoader(context, UserColumns.CONTENT_URI, null, where,
whereArgs, null);
}
public static Cursor getUserListCursor(Context context, int type, String id) {
final String where = IBaseColumns.TYPE + " =? AND " + IBaseColumns.OWNER
+ " =? ";
final String[] whereArgs = new String[]{String.valueOf(type), id};
return context.getContentResolver().query(UserColumns.CONTENT_URI,
null, where, whereArgs, null);
}
public static Cursor getUserListSearchCursor(Context context, int type,
String id, CharSequence constraint) {
if (TextUtils.isEmpty(constraint)) {
return getUserListCursor(context, type, id);
}
String where = IBaseColumns.TYPE + " =? AND " + IBaseColumns.OWNER
+ " =? AND (" + UserColumns.SCREEN_NAME + " like ? OR "
+ IBaseColumns.ID + " like ? )";
String query = new StringBuilder().append("%").append(constraint)
.append("%").toString();
String[] whereArgs = new String[]{String.valueOf(type), id, query,
query};
return context.getContentResolver().query(UserColumns.CONTENT_URI,
null, where, whereArgs, null);
}
}