Dismiss reactions when read on linked devices.
Also sends out read receipts for read reactions. At present, only iPad is sending these -- desktop still needs to add send support.
This commit is contained in:
parent
8b7506ed2d
commit
133a7d2576
3 changed files with 28 additions and 11 deletions
|
@ -36,6 +36,7 @@ import org.thoughtcrime.securesms.sms.IncomingTextMessage;
|
||||||
import org.thoughtcrime.securesms.sms.OutgoingTextMessage;
|
import org.thoughtcrime.securesms.sms.OutgoingTextMessage;
|
||||||
import org.thoughtcrime.securesms.util.JsonUtils;
|
import org.thoughtcrime.securesms.util.JsonUtils;
|
||||||
import org.thoughtcrime.securesms.util.SqlUtil;
|
import org.thoughtcrime.securesms.util.SqlUtil;
|
||||||
|
import org.thoughtcrime.securesms.util.Util;
|
||||||
import org.whispersystems.libsignal.IdentityKey;
|
import org.whispersystems.libsignal.IdentityKey;
|
||||||
import org.whispersystems.libsignal.util.Pair;
|
import org.whispersystems.libsignal.util.Pair;
|
||||||
import org.whispersystems.libsignal.util.guava.Optional;
|
import org.whispersystems.libsignal.util.guava.Optional;
|
||||||
|
@ -173,6 +174,14 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns
|
||||||
|
|
||||||
public abstract void ensureMigration();
|
public abstract void ensureMigration();
|
||||||
|
|
||||||
|
final @NonNull String getOutgoingTypeClause() {
|
||||||
|
List<String> 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) {
|
final int getInsecureMessagesSentForThread(long threadId) {
|
||||||
SQLiteDatabase db = databaseHelper.getReadableDatabase();
|
SQLiteDatabase db = databaseHelper.getReadableDatabase();
|
||||||
|
|
|
@ -901,9 +901,9 @@ public class MmsDatabase extends MessageDatabase {
|
||||||
@Override
|
@Override
|
||||||
public List<MarkedMessageInfo> setMessagesReadSince(long threadId, long sinceTimestamp) {
|
public List<MarkedMessageInfo> setMessagesReadSince(long threadId, long sinceTimestamp) {
|
||||||
if (sinceTimestamp == -1) {
|
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 {
|
} 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
|
@Override
|
||||||
public List<MarkedMessageInfo> setAllMessagesRead() {
|
public List<MarkedMessageInfo> setAllMessagesRead() {
|
||||||
return setMessagesRead(READ + " = 0", null);
|
return setMessagesRead(READ + " = 0 OR (" + REACTIONS_UNREAD + " = 1 AND (" + getOutgoingTypeClause() + "))", null);
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<MarkedMessageInfo> setMessagesRead(String where, String[] arguments) {
|
private List<MarkedMessageInfo> setMessagesRead(String where, String[] arguments) {
|
||||||
|
@ -925,10 +925,10 @@ public class MmsDatabase extends MessageDatabase {
|
||||||
database.beginTransaction();
|
database.beginTransaction();
|
||||||
|
|
||||||
try {
|
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()) {
|
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));
|
long threadId = cursor.getLong(cursor.getColumnIndex(THREAD_ID));
|
||||||
RecipientId recipientId = RecipientId.from(cursor.getLong(cursor.getColumnIndex(RECIPIENT_ID)));
|
RecipientId recipientId = RecipientId.from(cursor.getLong(cursor.getColumnIndex(RECIPIENT_ID)));
|
||||||
long dateSent = cursor.getLong(cursor.getColumnIndex(DATE_SENT));
|
long dateSent = cursor.getLong(cursor.getColumnIndex(DATE_SENT));
|
||||||
|
@ -944,6 +944,8 @@ public class MmsDatabase extends MessageDatabase {
|
||||||
|
|
||||||
ContentValues contentValues = new ContentValues();
|
ContentValues contentValues = new ContentValues();
|
||||||
contentValues.put(READ, 1);
|
contentValues.put(READ, 1);
|
||||||
|
contentValues.put(REACTIONS_UNREAD, 0);
|
||||||
|
contentValues.put(REACTIONS_LAST_SEEN, System.currentTimeMillis());
|
||||||
|
|
||||||
database.update(TABLE_NAME, contentValues, where, arguments);
|
database.update(TABLE_NAME, contentValues, where, arguments);
|
||||||
database.setTransactionSuccessful();
|
database.setTransactionSuccessful();
|
||||||
|
@ -968,7 +970,7 @@ public class MmsDatabase extends MessageDatabase {
|
||||||
RecipientId theirRecipientId = RecipientId.from(cursor.getLong(cursor.getColumnIndexOrThrow(RECIPIENT_ID)));
|
RecipientId theirRecipientId = RecipientId.from(cursor.getLong(cursor.getColumnIndexOrThrow(RECIPIENT_ID)));
|
||||||
RecipientId ourRecipientId = messageId.getRecipientId();
|
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 id = cursor.getLong(cursor.getColumnIndexOrThrow(ID));
|
||||||
long threadId = cursor.getLong(cursor.getColumnIndexOrThrow(THREAD_ID));
|
long threadId = cursor.getLong(cursor.getColumnIndexOrThrow(THREAD_ID));
|
||||||
long expiresIn = cursor.getLong(cursor.getColumnIndexOrThrow(EXPIRES_IN));
|
long expiresIn = cursor.getLong(cursor.getColumnIndexOrThrow(EXPIRES_IN));
|
||||||
|
@ -978,6 +980,8 @@ public class MmsDatabase extends MessageDatabase {
|
||||||
|
|
||||||
ContentValues values = new ContentValues();
|
ContentValues values = new ContentValues();
|
||||||
values.put(READ, 1);
|
values.put(READ, 1);
|
||||||
|
values.put(REACTIONS_UNREAD, 0);
|
||||||
|
values.put(REACTIONS_LAST_SEEN, System.currentTimeMillis());
|
||||||
|
|
||||||
if (expiresIn > 0) {
|
if (expiresIn > 0) {
|
||||||
values.put(EXPIRE_STARTED, expireStarted);
|
values.put(EXPIRE_STARTED, expireStarted);
|
||||||
|
|
|
@ -532,7 +532,7 @@ public class SmsDatabase extends MessageDatabase {
|
||||||
RecipientId theirRecipientId = messageId.getRecipientId();
|
RecipientId theirRecipientId = messageId.getRecipientId();
|
||||||
RecipientId outRecipientId = RecipientId.from(cursor.getLong(cursor.getColumnIndexOrThrow(RECIPIENT_ID)));
|
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 id = cursor.getLong(cursor.getColumnIndexOrThrow(ID));
|
||||||
long threadId = cursor.getLong(cursor.getColumnIndexOrThrow(THREAD_ID));
|
long threadId = cursor.getLong(cursor.getColumnIndexOrThrow(THREAD_ID));
|
||||||
long expiresIn = cursor.getLong(cursor.getColumnIndexOrThrow(EXPIRES_IN));
|
long expiresIn = cursor.getLong(cursor.getColumnIndexOrThrow(EXPIRES_IN));
|
||||||
|
@ -542,6 +542,8 @@ public class SmsDatabase extends MessageDatabase {
|
||||||
|
|
||||||
ContentValues contentValues = new ContentValues();
|
ContentValues contentValues = new ContentValues();
|
||||||
contentValues.put(READ, 1);
|
contentValues.put(READ, 1);
|
||||||
|
contentValues.put(REACTIONS_UNREAD, 0);
|
||||||
|
contentValues.put(REACTIONS_LAST_SEEN, System.currentTimeMillis());
|
||||||
|
|
||||||
if (expiresIn > 0) {
|
if (expiresIn > 0) {
|
||||||
contentValues.put(EXPIRE_STARTED, expireStarted);
|
contentValues.put(EXPIRE_STARTED, expireStarted);
|
||||||
|
@ -570,15 +572,15 @@ public class SmsDatabase extends MessageDatabase {
|
||||||
@Override
|
@Override
|
||||||
public List<MarkedMessageInfo> setMessagesReadSince(long threadId, long sinceTimestamp) {
|
public List<MarkedMessageInfo> setMessagesReadSince(long threadId, long sinceTimestamp) {
|
||||||
if (sinceTimestamp == -1) {
|
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 {
|
} 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
|
@Override
|
||||||
public List<MarkedMessageInfo> setAllMessagesRead() {
|
public List<MarkedMessageInfo> setAllMessagesRead() {
|
||||||
return setMessagesRead(READ + " = 0", null);
|
return setMessagesRead(READ + " = 0 OR (" + REACTIONS_UNREAD + " = 1 AND (" + getOutgoingTypeClause() + "))", null);
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<MarkedMessageInfo> setMessagesRead(String where, String[] arguments) {
|
private List<MarkedMessageInfo> 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);
|
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()) {
|
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));
|
long threadId = cursor.getLong(cursor.getColumnIndex(THREAD_ID));
|
||||||
RecipientId recipientId = RecipientId.from(cursor.getLong(cursor.getColumnIndex(RECIPIENT_ID)));
|
RecipientId recipientId = RecipientId.from(cursor.getLong(cursor.getColumnIndex(RECIPIENT_ID)));
|
||||||
long dateSent = cursor.getLong(cursor.getColumnIndex(DATE_SENT));
|
long dateSent = cursor.getLong(cursor.getColumnIndex(DATE_SENT));
|
||||||
|
@ -607,6 +609,8 @@ public class SmsDatabase extends MessageDatabase {
|
||||||
|
|
||||||
ContentValues contentValues = new ContentValues();
|
ContentValues contentValues = new ContentValues();
|
||||||
contentValues.put(READ, 1);
|
contentValues.put(READ, 1);
|
||||||
|
contentValues.put(REACTIONS_UNREAD, 0);
|
||||||
|
contentValues.put(REACTIONS_LAST_SEEN, System.currentTimeMillis());
|
||||||
|
|
||||||
database.update(TABLE_NAME, contentValues, where, arguments);
|
database.update(TABLE_NAME, contentValues, where, arguments);
|
||||||
database.setTransactionSuccessful();
|
database.setTransactionSuccessful();
|
||||||
|
|
Loading…
Add table
Reference in a new issue