Fix incorrect unread counts.

This commit is contained in:
Cody Henthorne
2023-08-14 15:38:08 -04:00
committed by Clark Chen
parent 8d0c41baa0
commit 13d9b6cc5a
4 changed files with 45 additions and 20 deletions

View File

@@ -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()

View File

@@ -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) {

View File

@@ -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

View File

@@ -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")
}
}