From 9ab285c3be252b1a3c0e19024a4f45679d6e8722 Mon Sep 17 00:00:00 2001 From: ryanzhao Date: Thu, 12 Aug 2021 14:14:37 +1000 Subject: [PATCH] handle home screen update for unsend request --- .../attachments/DatabaseAttachmentProvider.kt | 17 ++++++++++++----- .../securesms/database/MessagingDatabase.java | 2 +- .../securesms/database/MmsDatabase.java | 3 ++- .../securesms/database/MmsSmsDatabase.java | 4 +++- .../securesms/database/SmsDatabase.java | 4 +++- .../securesms/database/ThreadDatabase.java | 19 ++++++++++++++++--- .../database/MessageDataProvider.kt | 2 +- .../ReceivedMessageHandler.kt | 3 +-- 8 files changed, 39 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/attachments/DatabaseAttachmentProvider.kt b/app/src/main/java/org/thoughtcrime/securesms/attachments/DatabaseAttachmentProvider.kt index 99153ae673..aa1fe66f37 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/attachments/DatabaseAttachmentProvider.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/attachments/DatabaseAttachmentProvider.kt @@ -178,11 +178,18 @@ class DatabaseAttachmentProvider(context: Context, helper: SQLCipherOpenHelper) DatabaseFactory.getLokiMessageDatabase(context).deleteMessageServerHash(messageID) } - override fun updateMessageAsDeleted(messageID: Long) { - val smsDatabase = DatabaseFactory.getSmsDatabase(context) - val mmsDatabase = DatabaseFactory.getMmsDatabase(context) - smsDatabase.markAsDeleted(messageID) - mmsDatabase.markAsDeleted(messageID) + override fun updateMessageAsDeleted(timestamp: Long, author: String) { + val database = DatabaseFactory.getMmsSmsDatabase(context) + val address = Address.fromSerialized(author) + val message = database.getMessageFor(timestamp, address)!! + if (message.isMms) { + val mmsDatabase = DatabaseFactory.getMmsDatabase(context) + mmsDatabase.markAsDeleted(message.id, message.isRead) + } else { + val smsDatabase = DatabaseFactory.getSmsDatabase(context) + smsDatabase.markAsDeleted(message.id, message.isRead) + } + } override fun getServerHashForMessage(messageID: Long): String? { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MessagingDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/MessagingDatabase.java index d6dd097646..f542058c76 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MessagingDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MessagingDatabase.java @@ -38,7 +38,7 @@ public abstract class MessagingDatabase extends Database implements MmsSmsColumn public abstract void markAsSent(long messageId, boolean secure); public abstract void markUnidentified(long messageId, boolean unidentified); - public abstract void markAsDeleted(long messageId); + public abstract void markAsDeleted(long messageId, boolean read); public void addMismatchedIdentity(long messageId, Address address, IdentityKey identityKey) { try { 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 597d14f093..1fa26000a6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java @@ -392,7 +392,7 @@ public class MmsDatabase extends MessagingDatabase { } @Override - public void markAsDeleted(long messageId) { + public void markAsDeleted(long messageId, boolean read) { SQLiteDatabase database = databaseHelper.getWritableDatabase(); ContentValues contentValues = new ContentValues(); contentValues.put(READ, 1); @@ -403,6 +403,7 @@ public class MmsDatabase extends MessagingDatabase { ThreadUtils.queue(() -> attachmentDatabase.deleteAttachmentsForMessage(messageId)); long threadId = getThreadIdForMessage(messageId); + if (!read) { DatabaseFactory.getThreadDatabase(context).decrementUnread(threadId, 1); } updateMailboxBitmask(messageId, Types.BASE_TYPE_MASK, Types.BASE_DELETED_TYPE, Optional.of(threadId)); notifyConversationListeners(threadId); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java index 42284a4ff0..150f7f4c51 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java @@ -129,7 +129,9 @@ public class MmsSmsDatabase extends Database { String order = MmsSmsColumns.NORMALIZED_DATE_RECEIVED + " DESC"; String selection = MmsSmsColumns.THREAD_ID + " = " + threadId; - return queryTables(PROJECTION, selection, order, "1"); + // FIXME: Not sure if this will cause any performance issues + // return queryTables(PROJECTION, selection, order, "1"); + return queryTables(PROJECTION, selection, order, null); } public long getLastMessageID(long threadId) { 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 eaa289807e..5b75037636 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java @@ -184,12 +184,14 @@ public class SmsDatabase extends MessagingDatabase { } @Override - public void markAsDeleted(long messageId) { + public void markAsDeleted(long messageId, boolean read) { SQLiteDatabase database = databaseHelper.getWritableDatabase(); ContentValues contentValues = new ContentValues(); contentValues.put(READ, 1); contentValues.put(BODY, ""); database.update(TABLE_NAME, contentValues, ID_WHERE, new String[] {String.valueOf(messageId)}); + long threadId = getThreadIdForMessage(messageId); + if (!read) { DatabaseFactory.getThreadDatabase(context).decrementUnread(threadId, 1); } updateTypeBitmask(messageId, Types.BASE_TYPE_MASK, Types.BASE_DELETED_TYPE); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java index c9fa010e8b..3d894a0464 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java @@ -294,6 +294,14 @@ public class ThreadDatabase extends Database { String.valueOf(threadId)}); } + public void decrementUnread(long threadId, int amount) { + SQLiteDatabase db = databaseHelper.getWritableDatabase(); + db.execSQL("UPDATE " + TABLE_NAME + " SET " + READ + " = 0, " + + UNREAD_COUNT + " = " + UNREAD_COUNT + " - ? WHERE " + ID + " = ?", + new String[] {String.valueOf(amount), + String.valueOf(threadId)}); + } + public void setDistributionType(long threadId, int distributionType) { ContentValues contentValues = new ContentValues(1); contentValues.put(TYPE, distributionType); @@ -536,9 +544,14 @@ public class ThreadDatabase extends Database { try { reader = mmsSmsDatabase.readerFor(mmsSmsDatabase.getConversationSnippet(threadId)); - MessageRecord record; - - if (reader != null && (record = reader.getNext()) != null) { + MessageRecord record = null; + if (reader != null) { + record = reader.getNext(); + while (record != null && record.isDeleted()) { + record = reader.getNext(); + } + } + if (record != null && !record.isDeleted()) { updateThread(threadId, count, getFormattedBodyFor(record), getAttachmentUriFor(record), record.getTimestamp(), record.getDeliveryStatus(), record.getDeliveryReceiptCount(), record.getType(), unarchive, record.getExpiresIn(), record.getReadReceiptCount()); diff --git a/libsession/src/main/java/org/session/libsession/database/MessageDataProvider.kt b/libsession/src/main/java/org/session/libsession/database/MessageDataProvider.kt index 86534bb9a5..356307d1dd 100644 --- a/libsession/src/main/java/org/session/libsession/database/MessageDataProvider.kt +++ b/libsession/src/main/java/org/session/libsession/database/MessageDataProvider.kt @@ -13,7 +13,7 @@ interface MessageDataProvider { fun getMessageID(serverID: Long): Long? fun getMessageID(serverId: Long, threadId: Long): Pair? fun deleteMessage(messageID: Long, isSms: Boolean) - fun updateMessageAsDeleted(messageID: Long) + fun updateMessageAsDeleted(timestamp: Long, author: String) fun getServerHashForMessage(messageID: Long): String? fun getDatabaseAttachment(attachmentId: Long): DatabaseAttachment? fun getAttachmentStream(attachmentId: Long): SessionServiceAttachmentStream? diff --git a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt index b514d9672a..1d5a797b77 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt @@ -157,13 +157,12 @@ fun MessageReceiver.handleUnsendRequest(message: UnsendRequest) { val author = message.author ?: return val messageIdToDelete = storage.getMessageIdInDatabase(timestamp, author) ?: return if (!messageDataProvider.isOutgoingMessage(messageIdToDelete)) { - // TODO: Mark this message as read // TODO: Cancel the notification of this message } messageDataProvider.getServerHashForMessage(messageIdToDelete)?.let { serverHash -> SnodeAPI.deleteMessage(author, listOf(serverHash)) } - messageDataProvider.updateMessageAsDeleted(messageIdToDelete) + messageDataProvider.updateMessageAsDeleted(timestamp, author) } //endregion