From f5f56536bca021eb71920075d46ddd65d98f164b Mon Sep 17 00:00:00 2001 From: Sagar <85388413+Sagar0-0@users.noreply.github.com> Date: Tue, 22 Apr 2025 23:27:14 +0530 Subject: [PATCH] Fix unread count for edited messages. Co-authored-by: Cody Henthorne --- .../securesms/database/MessageTable.kt | 16 ++++++++------ .../helpers/SignalDatabaseMigrations.kt | 6 ++++-- .../V272_UpdateUnreadCountIndices.kt | 21 +++++++++++++++++++ 3 files changed, 35 insertions(+), 8 deletions(-) create mode 100644 app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V272_UpdateUnreadCountIndices.kt diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt index dbbc7b7cd4..e45e56e047 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt @@ -298,7 +298,7 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat // This index is created specifically for getting the number of messages in a thread and therefore needs to be kept in sync with that query "CREATE INDEX IF NOT EXISTS $INDEX_THREAD_COUNT ON $TABLE_NAME ($THREAD_ID) WHERE $STORY_TYPE = 0 AND $PARENT_STORY_ID <= 0 AND $SCHEDULED_DATE = -1 AND $LATEST_REVISION_ID IS NULL", // This index is created specifically for getting the number of unread messages in a thread and therefore needs to be kept in sync with that query - "CREATE INDEX IF NOT EXISTS $INDEX_THREAD_UNREAD_COUNT ON $TABLE_NAME ($THREAD_ID) WHERE $STORY_TYPE = 0 AND $PARENT_STORY_ID <= 0 AND $SCHEDULED_DATE = -1 AND $LATEST_REVISION_ID IS NULL AND $READ = 0" + "CREATE INDEX IF NOT EXISTS $INDEX_THREAD_UNREAD_COUNT ON $TABLE_NAME ($THREAD_ID) WHERE $STORY_TYPE = 0 AND $PARENT_STORY_ID <= 0 AND $SCHEDULED_DATE = -1 AND $ORIGINAL_MESSAGE_ID IS NULL AND $READ = 0" ) private val MMS_PROJECTION_BASE = arrayOf( @@ -2269,7 +2269,10 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat $THREAD_ID = ? AND $STORY_TYPE = 0 AND $PARENT_STORY_ID <= 0 AND - $LATEST_REVISION_ID IS NULL AND + ( + $ORIGINAL_MESSAGE_ID IS NULL OR + $LATEST_REVISION_ID IS NULL + ) AND ( $READ = 0 OR ( @@ -2386,7 +2389,7 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat return readableDatabase .select(FROM_RECIPIENT_ID, DATE_RECEIVED) .from("$TABLE_NAME INDEXED BY $INDEX_THREAD_UNREAD_COUNT") - .where("$THREAD_ID = ? AND $STORY_TYPE = 0 AND $PARENT_STORY_ID <= 0 AND $LATEST_REVISION_ID IS NULL AND $SCHEDULED_DATE = -1 AND $READ = 0 AND $MENTIONS_SELF = 1", threadId) + .where("$THREAD_ID = ? AND $STORY_TYPE = 0 AND $PARENT_STORY_ID <= 0 AND $ORIGINAL_MESSAGE_ID IS NULL AND $SCHEDULED_DATE = -1 AND $READ = 0 AND $MENTIONS_SELF = 1", threadId) .orderBy("$DATE_RECEIVED ASC") .limit(1) .run() @@ -2402,7 +2405,7 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat return readableDatabase .count() .from("$TABLE_NAME INDEXED BY $INDEX_THREAD_UNREAD_COUNT") - .where("$THREAD_ID = ? AND $STORY_TYPE = 0 AND $PARENT_STORY_ID <= 0 AND $LATEST_REVISION_ID IS NULL AND $SCHEDULED_DATE = -1 AND $READ = 0 AND $MENTIONS_SELF = 1", threadId) + .where("$THREAD_ID = ? AND $STORY_TYPE = 0 AND $PARENT_STORY_ID <= 0 AND $ORIGINAL_MESSAGE_ID IS NULL AND $SCHEDULED_DATE = -1 AND $READ = 0 AND $MENTIONS_SELF = 1", threadId) .run() .readToSingleInt() } @@ -2762,7 +2765,8 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat !MessageTypes.isUnblocked(type) && !retrieved.storyType.isStory && isNotStoryGroupReply && - !silent + !silent && + editedMessage == null ) { val incrementUnreadMentions = retrieved.mentions.isNotEmpty() && retrieved.mentions.any { it.recipientId == Recipient.self().id } threads.incrementUnread(threadId, 1, if (incrementUnreadMentions) 1 else 0) @@ -4337,7 +4341,7 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat return readableDatabase .select("COUNT(*)") .from("$TABLE_NAME INDEXED BY $INDEX_THREAD_UNREAD_COUNT") - .where("$THREAD_ID = $threadId AND $STORY_TYPE = 0 AND $PARENT_STORY_ID <= 0 AND $LATEST_REVISION_ID IS NULL AND $SCHEDULED_DATE = -1 AND $READ = 0") + .where("$THREAD_ID = $threadId AND $STORY_TYPE = 0 AND $PARENT_STORY_ID <= 0 AND $ORIGINAL_MESSAGE_ID IS NULL AND $SCHEDULED_DATE = -1 AND $READ = 0") .run() .readToSingleInt() } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SignalDatabaseMigrations.kt b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SignalDatabaseMigrations.kt index 966299bc91..5a052cff9a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SignalDatabaseMigrations.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SignalDatabaseMigrations.kt @@ -126,6 +126,7 @@ import org.thoughtcrime.securesms.database.helpers.migration.V268_FixInAppPaymen import org.thoughtcrime.securesms.database.helpers.migration.V269_BackupMediaSnapshotChanges import org.thoughtcrime.securesms.database.helpers.migration.V270_FixChatFolderColumnsForStorageSync import org.thoughtcrime.securesms.database.helpers.migration.V271_AddNotificationProfileIdColumn +import org.thoughtcrime.securesms.database.helpers.migration.V272_UpdateUnreadCountIndices import org.thoughtcrime.securesms.database.SQLiteDatabase as SignalSqliteDatabase /** @@ -257,10 +258,11 @@ object SignalDatabaseMigrations { 268 to V268_FixInAppPaymentsErrorStateConsistency, 269 to V269_BackupMediaSnapshotChanges, 270 to V270_FixChatFolderColumnsForStorageSync, - 271 to V271_AddNotificationProfileIdColumn + 271 to V271_AddNotificationProfileIdColumn, + 272 to V272_UpdateUnreadCountIndices ) - const val DATABASE_VERSION = 271 + const val DATABASE_VERSION = 272 @JvmStatic fun migrate(context: Application, db: SignalSqliteDatabase, oldVersion: Int, newVersion: Int) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V272_UpdateUnreadCountIndices.kt b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V272_UpdateUnreadCountIndices.kt new file mode 100644 index 0000000000..215898a880 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V272_UpdateUnreadCountIndices.kt @@ -0,0 +1,21 @@ +/* + * Copyright 2024 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.database.helpers.migration + +import android.app.Application +import org.thoughtcrime.securesms.database.SQLiteDatabase + +/** + * Updates a partial index for some performance-critical queries around unread counts. + */ +@Suppress("ClassName") +object V272_UpdateUnreadCountIndices : SignalDatabaseMigration { + override fun migrate(context: Application, db: SQLiteDatabase, oldVersion: Int, newVersion: Int) { + db.execSQL("DROP INDEX message_thread_unread_count_index") + + db.execSQL("CREATE INDEX IF NOT EXISTS message_thread_unread_count_index ON message (thread_id) WHERE story_type = 0 AND parent_story_id <= 0 AND scheduled_date = -1 AND original_message_id IS NULL AND read = 0") + } +}