diff options
Diffstat (limited to 'WordPress/src/main/java/org/wordpress/android/datasets/ReaderUserTable.java')
-rw-r--r-- | WordPress/src/main/java/org/wordpress/android/datasets/ReaderUserTable.java | 211 |
1 files changed, 211 insertions, 0 deletions
diff --git a/WordPress/src/main/java/org/wordpress/android/datasets/ReaderUserTable.java b/WordPress/src/main/java/org/wordpress/android/datasets/ReaderUserTable.java new file mode 100644 index 000000000..dcf94704e --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/datasets/ReaderUserTable.java @@ -0,0 +1,211 @@ +package org.wordpress.android.datasets; + +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteStatement; + +import org.wordpress.android.models.ReaderUser; +import org.wordpress.android.models.ReaderUserIdList; +import org.wordpress.android.models.ReaderUserList; +import org.wordpress.android.models.AccountHelper; +import org.wordpress.android.util.GravatarUtils; +import org.wordpress.android.util.SqlUtils; + +import java.util.ArrayList; + +/** + * stores info about the current user and liking users + */ +public class ReaderUserTable { + protected static void createTables(SQLiteDatabase db) { + db.execSQL("CREATE TABLE tbl_users (" + + " user_id INTEGER PRIMARY KEY," + + " blog_id INTEGER DEFAULT 0," + + " user_name TEXT," + + " display_name TEXT COLLATE NOCASE," + + " url TEXT," + + " profile_url TEXT," + + " avatar_url TEXT)"); + } + + protected static void dropTables(SQLiteDatabase db) { + db.execSQL("DROP TABLE IF EXISTS tbl_users"); + } + + public static void addOrUpdateUser(ReaderUser user) { + if (user==null) + return; + + ReaderUserList users = new ReaderUserList(); + users.add(user); + addOrUpdateUsers(users); + } + + private static final String COLUMN_NAMES = + " user_id," // 1 + + " blog_id," // 2 + + " user_name," // 3 + + " display_name," // 4 + + " url," // 5 + + " profile_url," // 6 + + " avatar_url"; // 7 + + public static void addOrUpdateUsers(ReaderUserList users) { + if (users==null || users.size()==0) + return; + + SQLiteDatabase db = ReaderDatabase.getWritableDb(); + db.beginTransaction(); + SQLiteStatement stmt = db.compileStatement("INSERT OR REPLACE INTO tbl_users (" + COLUMN_NAMES + ") VALUES (?1,?2,?3,?4,?5,?6,?7)"); + try { + for (ReaderUser user: users) { + stmt.bindLong (1, user.userId); + stmt.bindLong (2, user.blogId); + stmt.bindString(3, user.getUserName()); + stmt.bindString(4, user.getDisplayName()); + stmt.bindString(5, user.getUrl()); + stmt.bindString(6, user.getProfileUrl()); + stmt.bindString(7, user.getAvatarUrl()); + stmt.execute(); + } + + db.setTransactionSuccessful(); + + } finally { + db.endTransaction(); + SqlUtils.closeStatement(stmt); + } + } + + /* + * returns avatar urls for the passed user ids - used by post detail to show avatars for liking users + */ + public static ArrayList<String> getAvatarUrls(ReaderUserIdList userIds, int max, int avatarSz) { + ArrayList<String> avatars = new ArrayList<String>(); + if (userIds==null || userIds.size()==0) + return avatars; + + StringBuilder sb = new StringBuilder("SELECT user_id, avatar_url FROM tbl_users WHERE user_id IN ("); + + // make sure current user's avatar is returned if the passed list contains them - this is + // important since it may not otherwise be returned when a "max" is passed, and we want + // the current user to appear first in post detail when they like a post + long currentUserId = AccountHelper.getDefaultAccount().getUserId(); + boolean containsCurrentUser = userIds.contains(currentUserId); + if (containsCurrentUser) + sb.append(currentUserId); + + int numAdded = (containsCurrentUser ? 1 : 0); + for (Long id: userIds) { + // skip current user since we added them already + if (id!=currentUserId) { + if (numAdded > 0) + sb.append(","); + sb.append(id); + numAdded++; + if (max > 0 && numAdded >= max) + break; + } + } + sb.append(")"); + + Cursor c = ReaderDatabase.getReadableDb().rawQuery(sb.toString(), null); + try { + if (c.moveToFirst()) { + do { + long userId = c.getLong(0); + String url = GravatarUtils.fixGravatarUrl(c.getString(1), avatarSz); + // add current user to the top + if (userId==currentUserId) { + avatars.add(0, url); + } else { + avatars.add(url); + } + } while (c.moveToNext()); + } + return avatars; + } finally { + SqlUtils.closeCursor(c); + } + } + + public static ReaderUser getCurrentUser() { + return getUser(AccountHelper.getDefaultAccount().getUserId()); + } + + private static ReaderUser getUser(long userId) { + String args[] = {Long.toString(userId)}; + Cursor c = ReaderDatabase.getReadableDb().rawQuery("SELECT * FROM tbl_users WHERE user_id=?", args); + try { + if (!c.moveToFirst()) + return null; + return getUserFromCursor(c); + } finally { + SqlUtils.closeCursor(c); + } + } + + private static String getAvatarForUser(long userId) { + String args[] = {Long.toString(userId)}; + return SqlUtils.stringForQuery(ReaderDatabase.getReadableDb(), "SELECT avatar_url FROM tbl_users WHERE user_id=?", args); + } + + public static ReaderUserList getUsersWhoLikePost(long blogId, long postId, int max) { + String[] args = {Long.toString(blogId), Long.toString(postId)}; + String sql = "SELECT * from tbl_users WHERE user_id IN (SELECT user_id FROM tbl_post_likes WHERE blog_id=? AND post_id=?) ORDER BY display_name"; + if (max > 0) { + sql += " LIMIT " + Integer.toString(max); + } + + Cursor c = ReaderDatabase.getReadableDb().rawQuery(sql, args); + try { + ReaderUserList users = new ReaderUserList(); + if (c.moveToFirst()) { + do { + users.add(getUserFromCursor(c)); + } while (c.moveToNext()); + } + return users; + } finally { + SqlUtils.closeCursor(c); + } + } + + public static ReaderUserList getUsersWhoLikeComment(long blogId, long commentId, int max) { + String[] args = {Long.toString(blogId), + Long.toString(commentId)}; + String sql = "SELECT * from tbl_users WHERE user_id IN" + + " (SELECT user_id FROM tbl_comment_likes WHERE blog_id=? AND comment_id=?)" + + " ORDER BY display_name"; + if (max > 0) { + sql += " LIMIT " + Integer.toString(max); + } + + Cursor c = ReaderDatabase.getReadableDb().rawQuery(sql, args); + try { + ReaderUserList users = new ReaderUserList(); + if (c.moveToFirst()) { + do { + users.add(getUserFromCursor(c)); + } while (c.moveToNext()); + } + return users; + } finally { + SqlUtils.closeCursor(c); + } + } + + private static ReaderUser getUserFromCursor(Cursor c) { + ReaderUser user = new ReaderUser(); + + user.userId = c.getLong(c.getColumnIndex("user_id")); + user.blogId = c.getLong(c.getColumnIndex("blog_id")); + user.setUserName(c.getString(c.getColumnIndex("user_name"))); + user.setDisplayName(c.getString(c.getColumnIndex("display_name"))); + user.setUrl(c.getString(c.getColumnIndex("url"))); + user.setProfileUrl(c.getString(c.getColumnIndex("profile_url"))); + user.setAvatarUrl(c.getString(c.getColumnIndex("avatar_url"))); + + return user; + } +} |