diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MessageDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/MessageDatabase.java index ac285bd0d8..786151093e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MessageDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MessageDatabase.java @@ -36,6 +36,7 @@ import org.thoughtcrime.securesms.sms.IncomingTextMessage; import org.thoughtcrime.securesms.sms.OutgoingTextMessage; import org.thoughtcrime.securesms.util.JsonUtils; import org.thoughtcrime.securesms.util.SqlUtil; +import org.thoughtcrime.securesms.util.Util; import org.whispersystems.libsignal.IdentityKey; import org.whispersystems.libsignal.util.Pair; import org.whispersystems.libsignal.util.guava.Optional; @@ -173,6 +174,14 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns public abstract void ensureMigration(); + final @NonNull String getOutgoingTypeClause() { + List segments = new ArrayList<>(Types.OUTGOING_MESSAGE_TYPES.length); + for (long outgoingMessageType : Types.OUTGOING_MESSAGE_TYPES) { + segments.add("(" + getTypeField() + " & " + Types.BASE_TYPE_MASK + " = " + outgoingMessageType + ")"); + } + + return Util.join(segments, " OR "); + } final int getInsecureMessagesSentForThread(long threadId) { SQLiteDatabase db = databaseHelper.getReadableDatabase(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java index 6e4b8f91d5..4babd6ba26 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java @@ -901,9 +901,9 @@ public class MmsDatabase extends MessageDatabase { @Override public List setMessagesReadSince(long threadId, long sinceTimestamp) { if (sinceTimestamp == -1) { - return setMessagesRead(THREAD_ID + " = ? AND " + READ + " = 0", new String[] {String.valueOf(threadId)}); + return setMessagesRead(THREAD_ID + " = ? AND (" + READ + " = 0 OR (" + REACTIONS_UNREAD + " = 1 AND (" + getOutgoingTypeClause() + ")))", new String[] {String.valueOf(threadId)}); } else { - return setMessagesRead(THREAD_ID + " = ? AND " + READ + " = 0 AND " + DATE_RECEIVED + " <= ?", new String[]{String.valueOf(threadId), String.valueOf(sinceTimestamp)}); + return setMessagesRead(THREAD_ID + " = ? AND (" + READ + " = 0 OR (" + REACTIONS_UNREAD + " = 1 AND ( " + getOutgoingTypeClause() + " ))) AND " + DATE_RECEIVED + " <= ?", new String[]{String.valueOf(threadId), String.valueOf(sinceTimestamp)}); } } @@ -914,7 +914,7 @@ public class MmsDatabase extends MessageDatabase { @Override public List setAllMessagesRead() { - return setMessagesRead(READ + " = 0", null); + return setMessagesRead(READ + " = 0 OR (" + REACTIONS_UNREAD + " = 1 AND (" + getOutgoingTypeClause() + "))", null); } private List setMessagesRead(String where, String[] arguments) { @@ -925,10 +925,10 @@ public class MmsDatabase extends MessageDatabase { database.beginTransaction(); try { - cursor = database.query(TABLE_NAME, new String[] {ID, RECIPIENT_ID, DATE_SENT, MESSAGE_BOX, EXPIRES_IN, EXPIRE_STARTED, THREAD_ID}, where, arguments, null, null, null); + cursor = database.query(TABLE_NAME, new String[] {ID, RECIPIENT_ID, DATE_SENT, MESSAGE_BOX, EXPIRES_IN, EXPIRE_STARTED, THREAD_ID }, where, arguments, null, null, null); while(cursor != null && cursor.moveToNext()) { - if (Types.isSecureType(cursor.getLong(cursor.getColumnIndex(MESSAGE_BOX)))) { + if (Types.isSecureType(CursorUtil.requireLong(cursor, MESSAGE_BOX))) { long threadId = cursor.getLong(cursor.getColumnIndex(THREAD_ID)); RecipientId recipientId = RecipientId.from(cursor.getLong(cursor.getColumnIndex(RECIPIENT_ID))); long dateSent = cursor.getLong(cursor.getColumnIndex(DATE_SENT)); @@ -944,6 +944,8 @@ public class MmsDatabase extends MessageDatabase { ContentValues contentValues = new ContentValues(); contentValues.put(READ, 1); + contentValues.put(REACTIONS_UNREAD, 0); + contentValues.put(REACTIONS_LAST_SEEN, System.currentTimeMillis()); database.update(TABLE_NAME, contentValues, where, arguments); database.setTransactionSuccessful(); @@ -968,7 +970,7 @@ public class MmsDatabase extends MessageDatabase { RecipientId theirRecipientId = RecipientId.from(cursor.getLong(cursor.getColumnIndexOrThrow(RECIPIENT_ID))); RecipientId ourRecipientId = messageId.getRecipientId(); - if (ourRecipientId.equals(theirRecipientId) || Recipient.resolved(theirRecipientId).isGroup()) { + if (ourRecipientId.equals(theirRecipientId) || Recipient.resolved(theirRecipientId).isGroup() || ourRecipientId.equals(Recipient.self().getId())) { long id = cursor.getLong(cursor.getColumnIndexOrThrow(ID)); long threadId = cursor.getLong(cursor.getColumnIndexOrThrow(THREAD_ID)); long expiresIn = cursor.getLong(cursor.getColumnIndexOrThrow(EXPIRES_IN)); @@ -978,6 +980,8 @@ public class MmsDatabase extends MessageDatabase { ContentValues values = new ContentValues(); values.put(READ, 1); + values.put(REACTIONS_UNREAD, 0); + values.put(REACTIONS_LAST_SEEN, System.currentTimeMillis()); if (expiresIn > 0) { values.put(EXPIRE_STARTED, expireStarted); diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java index 1e08b54d94..4b6f9f44b3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java @@ -532,7 +532,7 @@ public class SmsDatabase extends MessageDatabase { RecipientId theirRecipientId = messageId.getRecipientId(); RecipientId outRecipientId = RecipientId.from(cursor.getLong(cursor.getColumnIndexOrThrow(RECIPIENT_ID))); - if (outRecipientId.equals(theirRecipientId)) { + if (outRecipientId.equals(theirRecipientId) || theirRecipientId.equals(Recipient.self().getId())) { long id = cursor.getLong(cursor.getColumnIndexOrThrow(ID)); long threadId = cursor.getLong(cursor.getColumnIndexOrThrow(THREAD_ID)); long expiresIn = cursor.getLong(cursor.getColumnIndexOrThrow(EXPIRES_IN)); @@ -542,6 +542,8 @@ public class SmsDatabase extends MessageDatabase { ContentValues contentValues = new ContentValues(); contentValues.put(READ, 1); + contentValues.put(REACTIONS_UNREAD, 0); + contentValues.put(REACTIONS_LAST_SEEN, System.currentTimeMillis()); if (expiresIn > 0) { contentValues.put(EXPIRE_STARTED, expireStarted); @@ -570,15 +572,15 @@ public class SmsDatabase extends MessageDatabase { @Override public List setMessagesReadSince(long threadId, long sinceTimestamp) { if (sinceTimestamp == -1) { - return setMessagesRead(THREAD_ID + " = ? AND " + READ + " = 0", new String[] {String.valueOf(threadId)}); + return setMessagesRead(THREAD_ID + " = ? AND (" + READ + " = 0 OR (" + REACTIONS_UNREAD + " = 1 AND (" + getOutgoingTypeClause() + ")))", new String[] {String.valueOf(threadId)}); } else { - return setMessagesRead(THREAD_ID + " = ? AND " + READ + " = 0 AND " + DATE_RECEIVED + " <= ?", new String[] {String.valueOf(threadId),String.valueOf(sinceTimestamp)}); + return setMessagesRead(THREAD_ID + " = ? AND (" + READ + " = 0 OR (" + REACTIONS_UNREAD + " = 1 AND ( " + getOutgoingTypeClause() + " ))) AND " + DATE_RECEIVED + " <= ?", new String[] {String.valueOf(threadId),String.valueOf(sinceTimestamp)}); } } @Override public List setAllMessagesRead() { - return setMessagesRead(READ + " = 0", null); + return setMessagesRead(READ + " = 0 OR (" + REACTIONS_UNREAD + " = 1 AND (" + getOutgoingTypeClause() + "))", null); } private List setMessagesRead(String where, String[] arguments) { @@ -591,7 +593,7 @@ public class SmsDatabase extends MessageDatabase { cursor = database.query(TABLE_NAME, new String[] {ID, RECIPIENT_ID, DATE_SENT, TYPE, EXPIRES_IN, EXPIRE_STARTED, THREAD_ID}, where, arguments, null, null, null); while (cursor != null && cursor.moveToNext()) { - if (Types.isSecureType(cursor.getLong(cursor.getColumnIndex(TYPE)))) { + if (Types.isSecureType(CursorUtil.requireLong(cursor, TYPE))) { long threadId = cursor.getLong(cursor.getColumnIndex(THREAD_ID)); RecipientId recipientId = RecipientId.from(cursor.getLong(cursor.getColumnIndex(RECIPIENT_ID))); long dateSent = cursor.getLong(cursor.getColumnIndex(DATE_SENT)); @@ -607,6 +609,8 @@ public class SmsDatabase extends MessageDatabase { ContentValues contentValues = new ContentValues(); contentValues.put(READ, 1); + contentValues.put(REACTIONS_UNREAD, 0); + contentValues.put(REACTIONS_LAST_SEEN, System.currentTimeMillis()); database.update(TABLE_NAME, contentValues, where, arguments); database.setTransactionSuccessful();