From d57903aa44fc9102c7d522f9b2d496acb9e543a7 Mon Sep 17 00:00:00 2001 From: jubb Date: Mon, 5 Jul 2021 09:59:54 +1000 Subject: [PATCH] fix: open group poller queues trim thread job only if received messages deleting quotes should now propagate to set quote missing flag in MMS and update the UI accordingly --- .../conversation/v2/messages/QuoteView.kt | 3 +- .../v2/messages/VisibleMessageContentView.kt | 7 ++++- .../securesms/database/MmsDatabase.java | 29 +++++++++++++++++++ .../securesms/database/SmsDatabase.java | 6 ++++ .../pollers/OpenGroupPollerV2.kt | 4 ++- 5 files changed, 45 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/QuoteView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/QuoteView.kt index 2ab119950a..b452a58b02 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/QuoteView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/QuoteView.kt @@ -136,8 +136,7 @@ class QuoteView : LinearLayout { accentLineLayoutParams.height = getIntrinsicContentHeight(maxContentWidth) // Match the intrinsic * content * height quoteViewAccentLine.layoutParams = accentLineLayoutParams quoteViewAccentLine.setBackgroundColor(getLineColor(isOutgoingMessage)) - } else { - attachments!! + } else if (attachments != null) { quoteViewAttachmentPreviewImageView.imageTintList = ColorStateList.valueOf(ResourcesCompat.getColor(resources, R.color.white, context.theme)) val backgroundColorID = if (UiModeUtilities.isDayUiMode(context)) R.color.black else R.color.accent val backgroundColor = ResourcesCompat.getColor(resources, backgroundColorID, context.theme) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageContentView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageContentView.kt index 16721b1625..258b93a1ef 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageContentView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageContentView.kt @@ -86,7 +86,12 @@ class VisibleMessageContentView : LinearLayout { // quote view content area's start margin. This unfortunately has to be calculated manually // here to get the layout right. val maxContentWidth = (maxWidth - 2 * resources.getDimension(R.dimen.medium_spacing) - toPx(16, resources)).roundToInt() - quoteView.bind(quote.author.toString(), quote.text, quote.attachment, thread, + val quoteText = if (quote.isOriginalMissing) { + context.getString(R.string.QuoteView_original_missing) + } else { + quote.text + } + quoteView.bind(quote.author.toString(), quoteText, quote.attachment, thread, message.isOutgoing, maxContentWidth, message.isOpenGroupInvitation, message.threadId, glide) mainContainer.addView(quoteView) val bodyTextView = VisibleMessageContentView.getBodyTextView(context, message, searchQuery) 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 ce2ddba24a..abae960330 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java @@ -63,6 +63,7 @@ import org.thoughtcrime.securesms.attachments.MmsNotificationAttachment; import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper; import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord; import org.thoughtcrime.securesms.database.model.MessageRecord; +import org.thoughtcrime.securesms.database.model.MmsMessageRecord; import org.thoughtcrime.securesms.database.model.NotificationMmsMessageRecord; import org.thoughtcrime.securesms.database.model.Quote; import org.thoughtcrime.securesms.mms.MmsException; @@ -881,6 +882,20 @@ public class MmsDatabase extends MessagingDatabase { } } + public void deleteQuotedFromMessages(MessageRecord toDeleteRecord) { + String query = THREAD_ID + " = ?"; + Cursor threadMmsCursor = rawQuery(query, new String[]{String.valueOf(toDeleteRecord.getThreadId())}); + Reader reader = readerFor(threadMmsCursor); + MmsMessageRecord messageRecord; + + while ((messageRecord = (MmsMessageRecord) reader.getNext()) != null) { + if (messageRecord.getQuote() != null && toDeleteRecord.getDateSent() == messageRecord.getQuote().getId()) { + setQuoteMissing(messageRecord.getId()); + } + } + reader.close(); + } + public boolean delete(long messageId) { long threadId = getThreadIdForMessage(messageId); AttachmentDatabase attachmentDatabase = DatabaseFactory.getAttachmentDatabase(context); @@ -889,6 +904,12 @@ public class MmsDatabase extends MessagingDatabase { GroupReceiptDatabase groupReceiptDatabase = DatabaseFactory.getGroupReceiptDatabase(context); groupReceiptDatabase.deleteRowsForMessage(messageId); + MessageRecord toDelete; + try (Cursor messageCursor = getMessage(messageId)) { + toDelete = readerFor(messageCursor).getNext(); + } + + deleteQuotedFromMessages(toDelete); SQLiteDatabase database = databaseHelper.getWritableDatabase(); database.delete(TABLE_NAME, ID_WHERE, new String[] {messageId+""}); boolean threadDeleted = DatabaseFactory.getThreadDatabase(context).update(threadId, false); @@ -1066,6 +1087,14 @@ public class MmsDatabase extends MessagingDatabase { return new OutgoingMessageReader(message, threadId); } + public int setQuoteMissing(long messageId) { + ContentValues contentValues = new ContentValues(); + contentValues.put(QUOTE_MISSING, 1); + SQLiteDatabase database = databaseHelper.getReadableDatabase(); + int rows = database.update(TABLE_NAME, contentValues, ID + " = ?", new String[]{ String.valueOf(messageId) }); + return rows; + } + public static class Status { public static final int DOWNLOAD_INITIALIZED = 1; public static final int DOWNLOAD_NO_CONNECTIVITY = 2; 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 6706f5fe77..f66479c41f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java @@ -514,6 +514,12 @@ public class SmsDatabase extends MessagingDatabase { Log.i("MessageDatabase", "Deleting: " + messageId); SQLiteDatabase db = databaseHelper.getWritableDatabase(); long threadId = getThreadIdForMessage(messageId); + try { + SmsMessageRecord toDelete = getMessage(messageId); + DatabaseFactory.getMmsDatabase(context).deleteQuotedFromMessages(toDelete); + } catch (NoSuchMessageException e) { + Log.e(TAG, "Couldn't find message record for messageId "+messageId, e); + } db.delete(TABLE_NAME, ID_WHERE, new String[] {messageId+""}); boolean threadDeleted = DatabaseFactory.getThreadDatabase(context).update(threadId, false); notifyConversationListeners(threadId); diff --git a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/OpenGroupPollerV2.kt b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/OpenGroupPollerV2.kt index 7cfc44801f..b08fa66f34 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/OpenGroupPollerV2.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/OpenGroupPollerV2.kt @@ -94,7 +94,9 @@ class OpenGroupPollerV2(private val server: String, private val executorService: if (actualMax > 0) { storage.setLastMessageServerID(room, server, actualMax) } - JobQueue.shared.add(TrimThreadJob(threadId)) + if (messages.isNotEmpty()) { + JobQueue.shared.add(TrimThreadJob(threadId)) + } } private fun handleDeletedMessages(room: String, openGroupID: String, deletions: List) {