mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-03-02 07:23:38 +00:00
Fix incorrect unread counts.
This commit is contained in:
committed by
Clark Chen
parent
8d0c41baa0
commit
13d9b6cc5a
@@ -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()
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user