From 13d9b6cc5a1ac6d373bcef85f328304c90136784 Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Mon, 14 Aug 2023 15:38:08 -0400 Subject: [PATCH] Fix incorrect unread counts. --- .../securesms/database/MessageTable.kt | 9 ++---- .../securesms/database/ThreadTable.kt | 30 +++++++++++-------- .../helpers/SignalDatabaseMigrations.kt | 7 ++++- .../V202_DropMessageTableThreadDateIndex.kt | 19 ++++++++++++ 4 files changed, 45 insertions(+), 20 deletions(-) create mode 100644 app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V202_DropMessageTableThreadDateIndex.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 70637c2696..90eff676aa 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt @@ -266,7 +266,6 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat ) """ - private const val INDEX_THREAD_DATE = "message_thread_date_index" private const val INDEX_THREAD_STORY_SCHEDULED_DATE_LATEST_REVISION_ID = "message_thread_story_parent_story_scheduled_date_latest_revision_id_index" private const val INDEX_DATE_SENT_FROM_TO_THREAD = "message_date_sent_from_to_thread_index" @@ -276,7 +275,6 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat "CREATE INDEX IF NOT EXISTS message_type_index ON $TABLE_NAME ($TYPE)", "CREATE INDEX IF NOT EXISTS $INDEX_DATE_SENT_FROM_TO_THREAD ON $TABLE_NAME ($DATE_SENT, $FROM_RECIPIENT_ID, $TO_RECIPIENT_ID, $THREAD_ID)", "CREATE INDEX IF NOT EXISTS message_date_server_index ON $TABLE_NAME ($DATE_SERVER)", - "CREATE INDEX IF NOT EXISTS $INDEX_THREAD_DATE ON $TABLE_NAME ($THREAD_ID, $DATE_RECEIVED);", "CREATE INDEX IF NOT EXISTS message_reactions_unread_index ON $TABLE_NAME ($REACTIONS_UNREAD);", "CREATE INDEX IF NOT EXISTS message_story_type_index ON $TABLE_NAME ($STORY_TYPE);", "CREATE INDEX IF NOT EXISTS message_parent_story_id_index ON $TABLE_NAME ($PARENT_STORY_ID);", @@ -1404,7 +1402,7 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat val where = "$IS_STORY_CLAUSE AND ($outgoingTypeClause) AND $NOTIFIED = 0 AND ($TYPE & ${MessageTypes.BASE_TYPE_MASK}) = ${MessageTypes.BASE_SENT_FAILED_TYPE}" writableDatabase - .update("$TABLE_NAME INDEXED BY $INDEX_THREAD_DATE") + .update("$TABLE_NAME INDEXED BY $INDEX_THREAD_STORY_SCHEDULED_DATE_LATEST_REVISION_ID") .values(NOTIFIED to 1) .where(where) .run() @@ -2333,7 +2331,7 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat val releaseChannelId = SignalStore.releaseChannelValues().releaseChannelRecipientId return writableDatabase.rawQuery( """ - UPDATE $TABLE_NAME INDEXED BY $INDEX_THREAD_DATE + UPDATE $TABLE_NAME INDEXED BY $INDEX_THREAD_STORY_SCHEDULED_DATE_LATEST_REVISION_ID SET $READ = 1, $REACTIONS_UNREAD = 0, $REACTIONS_LAST_SEEN = ${System.currentTimeMillis()} WHERE $where RETURNING $ID, $FROM_RECIPIENT_ID, $DATE_SENT, $TYPE, $EXPIRES_IN, $EXPIRE_STARTED, $THREAD_ID, $STORY_TYPE @@ -3340,7 +3338,6 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat } threadIds.forEach { - threads.updateReadState(it) threads.update( threadId = it, unarchive = false, @@ -4244,7 +4241,7 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat fun getUnreadCount(threadId: Long): Int { return readableDatabase .select("COUNT(*)") - .from("$TABLE_NAME INDEXED BY $INDEX_THREAD_DATE") + .from("$TABLE_NAME INDEXED BY $INDEX_THREAD_STORY_SCHEDULED_DATE_LATEST_REVISION_ID") .where("$READ = 0 AND $STORY_TYPE = 0 AND $THREAD_ID = $threadId AND $PARENT_STORY_ID <= 0 AND $LATEST_REVISION_ID IS NULL") .run() .readToSingleInt() diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadTable.kt index 99b8d66948..5928ae1459 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadTable.kt @@ -220,7 +220,9 @@ class ThreadTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa type: Long, unarchive: Boolean, expiresIn: Long, - readReceiptCount: Int + readReceiptCount: Int, + unreadCount: Int, + unreadMentionCount: Int ) { var extraSerialized: String? = null @@ -244,7 +246,9 @@ class ThreadTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa DELIVERY_RECEIPT_COUNT to deliveryReceiptCount, READ_RECEIPT_COUNT to readReceiptCount, EXPIRES_IN to expiresIn, - ACTIVE to 1 + ACTIVE to 1, + UNREAD_COUNT to unreadCount, + UNREAD_SELF_MENTION_COUNT to unreadMentionCount ) writableDatabase @@ -288,8 +292,10 @@ class ThreadTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa val contentValues = contentValuesOf( DATE to date - date % 1000, SNIPPET to snippet, + SNIPPET_URI to attachment?.toString(), SNIPPET_TYPE to type, - SNIPPET_URI to attachment?.toString() + SNIPPET_CONTENT_TYPE to null, + SNIPPET_EXTRAS to null ) if (unarchive && allowedToUnarchive(threadId)) { @@ -1247,14 +1253,6 @@ class ThreadTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa .run() } - fun setHasSentSilently(threadId: Long, hasSent: Boolean) { - writableDatabase - .update(TABLE_NAME) - .values(HAS_SENT to if (hasSent) 1 else 0) - .where("$ID = ?", threadId) - .run() - } - fun updateReadState(threadId: Long) { val previous = getThreadRecord(threadId) val unreadCount = messages.getUnreadCount(threadId) @@ -1454,7 +1452,9 @@ class ThreadTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa type = 0, unarchive = unarchive, expiresIn = 0, - readReceiptCount = 0 + readReceiptCount = 0, + unreadCount = 0, + unreadMentionCount = 0 ) } return@withinTransaction true @@ -1465,6 +1465,8 @@ class ThreadTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa } val threadBody: ThreadBody = ThreadBodyUtil.getFormattedBodyFor(context, record) + val unreadCount: Int = messages.getUnreadCount(threadId) + val unreadMentionCount: Int = messages.getUnreadMentionCount(threadId) updateThread( threadId = threadId, @@ -1479,7 +1481,9 @@ class ThreadTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa type = record.type, unarchive = unarchive, expiresIn = record.expiresIn, - readReceiptCount = record.readReceiptCount + readReceiptCount = record.readReceiptCount, + unreadCount = unreadCount, + unreadMentionCount = unreadMentionCount ) if (notifyListeners) { 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 bfccbf088c..3f2b6abcf4 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 @@ -57,6 +57,7 @@ import org.thoughtcrime.securesms.database.helpers.migration.V198_AddMacDigestCo import org.thoughtcrime.securesms.database.helpers.migration.V199_AddThreadActiveColumn import org.thoughtcrime.securesms.database.helpers.migration.V200_ResetPniColumn import org.thoughtcrime.securesms.database.helpers.migration.V201_RecipientTableValidations +import org.thoughtcrime.securesms.database.helpers.migration.V202_DropMessageTableThreadDateIndex /** * Contains all of the database migrations for [SignalDatabase]. Broken into a separate file for cleanliness. @@ -65,7 +66,7 @@ object SignalDatabaseMigrations { val TAG: String = Log.tag(SignalDatabaseMigrations.javaClass) - const val DATABASE_VERSION = 201 + const val DATABASE_VERSION = 202 @JvmStatic fun migrate(context: Application, db: SQLiteDatabase, oldVersion: Int, newVersion: Int) { @@ -280,6 +281,10 @@ object SignalDatabaseMigrations { if (oldVersion < 201) { V201_RecipientTableValidations.migrate(context, db, oldVersion, newVersion) } + + if (oldVersion < 202) { + V202_DropMessageTableThreadDateIndex.migrate(context, db, oldVersion, newVersion) + } } @JvmStatic diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V202_DropMessageTableThreadDateIndex.kt b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V202_DropMessageTableThreadDateIndex.kt new file mode 100644 index 0000000000..53903dd95d --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V202_DropMessageTableThreadDateIndex.kt @@ -0,0 +1,19 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.database.helpers.migration + +import android.app.Application +import net.zetetic.database.sqlcipher.SQLiteDatabase + +/** + * Drop the unnecessary thread-date index. + */ +@Suppress("ClassName") +object V202_DropMessageTableThreadDateIndex : SignalDatabaseMigration { + override fun migrate(context: Application, db: SQLiteDatabase, oldVersion: Int, newVersion: Int) { + db.execSQL("DROP INDEX IF EXISTS message_thread_date_index") + } +}