/* * Copyright (c) 2014 yvolk (Yuri Volkov), http://yurivolkov.com * * 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 org.andstatus.app.data; import android.content.ContentValues; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.provider.BaseColumns; import android.text.TextUtils; import org.andstatus.app.database.MsgOfUserTable; import org.andstatus.app.util.ContentValuesUtils; class MsgOfUserValues { private long rowId; private long userId; private long msgId; private ContentValues contentValues = new ContentValues(); public MsgOfUserValues(long userId) { this.userId = userId; contentValues.put(MsgOfUserTable.USER_ID, userId); } /** * Move all keys that belong to MsgOfUser table from values to the newly created ContentValues. * Returns null if we don't need MsgOfUser for this Msg * @param values * @return */ public static MsgOfUserValues valueOf(long userId, ContentValues values) { return valueOf(userId, "", values); } public static MsgOfUserValues valuesOfOtherUser(ContentValues values) { long userId = ContentValuesUtils.moveLongKey(MsgOfUserTable.USER_ID, MsgOfUserTable.SUFFIX_FOR_OTHER_USER, values, null); return valueOf(userId, MsgOfUserTable.SUFFIX_FOR_OTHER_USER, values); } private static MsgOfUserValues valueOf(long userId, String sourceSuffix, ContentValues values) { MsgOfUserValues userValues = new MsgOfUserValues(userId); userValues.setMsgId(values.getAsLong(BaseColumns._ID)); ContentValuesUtils.moveBooleanKey(MsgOfUserTable.SUBSCRIBED, sourceSuffix, values, userValues.contentValues); ContentValuesUtils.moveBooleanKey(MsgOfUserTable.FAVORITED, sourceSuffix, values, userValues.contentValues); ContentValuesUtils.moveBooleanKey(MsgOfUserTable.REBLOGGED, sourceSuffix, values, userValues.contentValues); ContentValuesUtils.moveStringKey(MsgOfUserTable.REBLOG_OID, sourceSuffix, values, userValues.contentValues); ContentValuesUtils.moveBooleanKey(MsgOfUserTable.MENTIONED, sourceSuffix, values, userValues.contentValues); ContentValuesUtils.moveBooleanKey(MsgOfUserTable.REPLIED, sourceSuffix, values, userValues.contentValues); ContentValuesUtils.moveBooleanKey(MsgOfUserTable.DIRECTED, sourceSuffix, values, userValues.contentValues); return userValues; } boolean isValid() { return userId != 0 && msgId != 0; } boolean isEmpty() { boolean empty = true; if (isTrue(MsgOfUserTable.SUBSCRIBED) || isTrue(MsgOfUserTable.FAVORITED) || isTrue(MsgOfUserTable.REBLOGGED) || isTrue(MsgOfUserTable.MENTIONED) || isTrue(MsgOfUserTable.REPLIED) || isTrue(MsgOfUserTable.DIRECTED) ) { empty = false; } if (empty && contentValues.containsKey(MsgOfUserTable.REBLOG_OID) && !TextUtils.isEmpty(contentValues.getAsString(MsgOfUserTable.REBLOG_OID))) { empty = false; } if (!isValid()) { empty = true; } return empty; } private boolean isTrue(String key) { boolean value = false; if (contentValues.containsKey(key) ) { value = contentValues.getAsInteger(key) != 0; } return value; } long getUserId() { return userId; } public long getMsgId() { return msgId; } public void setMsgId(Long msgIdIn) { if (msgIdIn != null) { msgId = msgIdIn; } else { msgId = 0; } contentValues.put(MsgOfUserTable.MSG_ID, msgId); } long insert(SQLiteDatabase db) { if (!isEmpty()) { rowId = db.insert(MsgOfUserTable.TABLE_NAME, MsgOfUserTable.MSG_ID, contentValues); if (rowId == -1) { throw new SQLException("Failed to insert row into " + MsgOfUserTable.TABLE_NAME); } } return rowId; } public int update(SQLiteDatabase db) { int count = 0; if (!isValid()) { return count; } String where = "(" + MsgOfUserTable.MSG_ID + "=" + msgId + " AND " + MsgOfUserTable.USER_ID + "=" + userId + ")"; String sql = "SELECT * FROM " + MsgOfUserTable.TABLE_NAME + " WHERE " + where; Cursor cursor = null; try { cursor = db.rawQuery(sql, null); boolean exists = cursor.moveToFirst(); DbUtils.closeSilently(cursor); if (exists) { count += db.update(MsgOfUserTable.TABLE_NAME, contentValues, where, null); } else { insert(db); if (rowId != 0) { count += 1; } } } finally { DbUtils.closeSilently(cursor); } return count; } }