Skip to content

Commit 5dbf398

Browse files
[SES-5366] - Reimplement how we handle mark read for notification (#2074)
1 parent d6baa5e commit 5dbf398

6 files changed

Lines changed: 78 additions & 21 deletions

File tree

app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabaseExt.kt

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,31 @@ object MmsSmsDatabaseExt {
378378
}
379379
}
380380

381+
/**
382+
* Find the latest message timestamp in a thread.
383+
*
384+
* @return The latest message timestamp in a thread, or 0 if there are no messages in the thread.
385+
*/
386+
fun MmsSmsDatabase.getLatestMessageTimestamp(threadAddress: Address.Conversable): Long {
387+
return readableDatabase.query("""
388+
WITH sms_max AS (
389+
SELECT MAX(m.${SmsDatabase.DATE_SENT}) AS last
390+
FROM ${SmsDatabase.TABLE_NAME} m
391+
INNER JOIN ${ThreadDatabase.TABLE_NAME} t ON m.${SmsDatabase.THREAD_ID} = t.${ThreadDatabase.ID}
392+
WHERE t.${ThreadDatabase.ADDRESS} = ?1
393+
), mms_max AS (
394+
SELECT MAX(m.${MmsDatabase.DATE_SENT}) AS last
395+
FROM ${MmsDatabase.TABLE_NAME} m
396+
INNER JOIN ${ThreadDatabase.TABLE_NAME} t ON m.${MmsSmsColumns.THREAD_ID} = t.${ThreadDatabase.ID}
397+
WHERE t.${ThreadDatabase.ADDRESS} = ?1
398+
)
399+
SELECT MAX(IFNULL((SELECT last FROM sms_max LIMIT 1), 0), IFNULL((SELECT last FROM mms_max LIMIT 1), 0))
400+
""", arrayOf(threadAddress.address)).use { cursor ->
401+
require(cursor.moveToNext())
402+
cursor.getLong(0)
403+
}
404+
}
405+
381406
/**
382407
* Find all incoming messages (including control messages) for the given thread.
383408
* Ordered by date sent in ascending order.

app/src/main/java/org/thoughtcrime/securesms/database/ReactionDatabase.kt

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import kotlinx.coroutines.flow.MutableSharedFlow
99
import net.zetetic.database.sqlcipher.SQLiteDatabase
1010
import org.json.JSONArray
1111
import org.json.JSONException
12+
import org.session.libsession.utilities.Address
1213
import org.session.libsignal.utilities.SaneJSONObject
1314
import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper
1415
import org.thoughtcrime.securesms.database.model.MessageId
@@ -264,6 +265,35 @@ class ReactionDatabase(context: Context, helper: Provider<SQLCipherOpenHelper>)
264265
)
265266
}
266267

268+
/**
269+
* Get the latest reaction timestamp for the given thread.
270+
*
271+
* @return The latest reaction timestamp, or null if there are no reactions.
272+
*/
273+
fun getLatestReactionTimestamp(threadAddress: Address.Conversable): Long? {
274+
return readableDatabase.query("""
275+
SELECT MAX(r.$DATE_SENT)
276+
FROM $TABLE_NAME r
277+
WHERE (r.$MESSAGE_ID, r.$IS_MMS) IN (
278+
SELECT m.${SmsDatabase.ID}, 0 FROM ${SmsDatabase.TABLE_NAME} m
279+
INNER JOIN ${ThreadDatabase.TABLE_NAME} t ON m.${SmsDatabase.THREAD_ID} = t.${ThreadDatabase.ID}
280+
WHERE t.${ThreadDatabase.ADDRESS} = ?1
281+
282+
UNION ALL
283+
284+
SELECT m.${MmsSmsColumns.ID}, 1 FROM ${MmsDatabase.TABLE_NAME} m
285+
INNER JOIN ${ThreadDatabase.TABLE_NAME} t ON m.${MmsSmsColumns.THREAD_ID} = t.${ThreadDatabase.ID}
286+
WHERE t.${ThreadDatabase.ADDRESS} = ?1
287+
)
288+
""", arrayOf(threadAddress)).use { cursor ->
289+
if (cursor.moveToNext()) {
290+
cursor.getLong(0)
291+
} else {
292+
null
293+
}
294+
}
295+
}
296+
267297
/**
268298
* Update the count for all reactions with the given emoji on the specified message.
269299
* Note this should ONLY be used on community reactions as each reaction record contains the

app/src/main/java/org/thoughtcrime/securesms/notifications/FullNotificationHandler.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,6 @@ class FullNotificationHandler @Inject constructor(
311311
threadAddress = threadAddress,
312312
threadRecipient = threadRecipient,
313313
threadId = threadId,
314-
latestMessageTimestampMs = latestMessageTimestampMs,
315314
messages = messages,
316315
canReply = true,
317316
silent = updateOnly
@@ -382,7 +381,6 @@ class FullNotificationHandler @Inject constructor(
382381
threadAddress = threadAddress,
383382
threadRecipient = threadRecipient,
384383
threadId = threadId,
385-
latestMessageTimestampMs = newMessage.dateSent,
386384
messages = listOf(
387385
NotificationCompat.MessagingStyle.Message(
388386
context.getText(R.string.messageRequestsNew),

app/src/main/java/org/thoughtcrime/securesms/notifications/NameOnlyNotificationHandler.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,6 @@ class NameOnlyNotificationHandler @Inject constructor(
113113
threadAddress = threadAddress,
114114
threadRecipient = threadRecipient,
115115
threadId = value.threadId,
116-
latestMessageTimestampMs = latestMessage.dateSent,
117116
messages = listOf(NotificationCompat.MessagingStyle.Message(
118117
context.resources.getQuantityText(R.plurals.messageNew, 1),
119118
latestMessage.dateSent,
@@ -160,7 +159,6 @@ class NameOnlyNotificationHandler @Inject constructor(
160159
threadAddress = threadAddress,
161160
threadRecipient = threadRecipient,
162161
threadId = message.threadId,
163-
latestMessageTimestampMs = notified.dateSent,
164162
messages = listOf(NotificationCompat.MessagingStyle.Message(
165163
context.resources.getQuantityText(R.plurals.messageNew, 1),
166164
notified.dateSent,

app/src/main/java/org/thoughtcrime/securesms/notifications/NotificationActionReceiver.kt

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ import org.session.libsession.messaging.sending_receiving.MessageSender
1717
import org.session.libsession.network.SnodeClock
1818
import org.session.libsession.utilities.Address
1919
import org.session.libsignal.utilities.Log
20+
import org.thoughtcrime.securesms.database.MmsSmsDatabase
21+
import org.thoughtcrime.securesms.database.MmsSmsDatabaseExt.getLatestMessageTimestamp
22+
import org.thoughtcrime.securesms.database.ReactionDatabase
2023
import org.thoughtcrime.securesms.database.RecipientRepository
2124
import org.thoughtcrime.securesms.database.SmsDatabase
2225
import org.thoughtcrime.securesms.database.Storage
@@ -26,6 +29,7 @@ import org.thoughtcrime.securesms.database.model.MessageId
2629
import org.thoughtcrime.securesms.dependencies.ManagerScope
2730
import org.thoughtcrime.securesms.pro.ProStatusManager
2831
import javax.inject.Inject
32+
import kotlin.math.max
2933

3034
/**
3135
* A [BroadcastReceiver] that handles notification actions: marking a conversation as read,
@@ -54,21 +58,24 @@ class NotificationActionReceiver : BroadcastReceiver() {
5458
@Inject
5559
lateinit var proStatusManager: ProStatusManager
5660

61+
@Inject
62+
lateinit var mmsSmsDatabase: MmsSmsDatabase
63+
64+
@Inject
65+
lateinit var reactionDatabase: ReactionDatabase
66+
5767
@Inject
5868
@ManagerScope
5969
lateinit var scope: CoroutineScope
6070

6171
override fun onReceive(context: Context, intent: Intent) {
62-
val handler: (suspend () -> Unit) = when (intent.action) {
63-
ACTION_MARK_READ -> ({ handleMarkRead(intent) })
64-
ACTION_REPLY -> ({ handleReply(intent) })
65-
else -> return
66-
}
67-
6872
val result = goAsync()
6973
scope.launch {
7074
try {
71-
handler()
75+
when (intent.action) {
76+
ACTION_MARK_READ -> handleMarkRead(intent)
77+
ACTION_REPLY -> handleReply(intent)
78+
}
7279
} catch (e: Throwable) {
7380
Log.e(TAG, "Error handling notification action: ${intent.action}", e)
7481
} finally {
@@ -82,8 +89,12 @@ class NotificationActionReceiver : BroadcastReceiver() {
8289
IntentCompat.getParcelableExtra(intent, EXTRA_THREAD_ADDRESS, Address.Conversable::class.java)
8390
) { "Missing thread address" }
8491

85-
val lastSeenTime = intent.getLongExtra(EXTRA_LATEST_MESSAGE_TIMESTAMP, 0L)
86-
storage.updateConversationLastSeenIfNeeded(threadAddress, lastSeenTime)
92+
val latestMessageTimestamp = mmsSmsDatabase.getLatestMessageTimestamp(threadAddress)
93+
val latestReactionTimestamp = reactionDatabase.getLatestReactionTimestamp(threadAddress) ?: 0L
94+
95+
storage.updateConversationLastSeenIfNeeded(threadAddress,
96+
lastSeenTime = max(a = latestReactionTimestamp, b = latestMessageTimestamp)
97+
)
8798
}
8899

89100
private fun handleReply(intent: Intent) {
@@ -131,21 +142,18 @@ class NotificationActionReceiver : BroadcastReceiver() {
131142
private const val ACTION_REPLY = "network.loki.securesms.notifications.REPLY"
132143

133144
private const val EXTRA_THREAD_ADDRESS = "thread_address"
134-
private const val EXTRA_LATEST_MESSAGE_TIMESTAMP = "latest_timestamp"
135145
private const val EXTRA_REPLY_TEXT = "extra_reply_text"
136146

137147
fun buildMarkReadIntent(
138148
context: Context,
139-
threadAddress: Address.Conversable,
140-
latestMessageTimestampMs: Long
149+
threadAddress: Address.Conversable
141150
): PendingIntent {
142151
return PendingIntent.getBroadcast(
143152
context,
144153
threadAddress.hashCode(),
145154
Intent(context, NotificationActionReceiver::class.java)
146155
.setAction(ACTION_MARK_READ)
147-
.putExtra(EXTRA_THREAD_ADDRESS, threadAddress)
148-
.putExtra(EXTRA_LATEST_MESSAGE_TIMESTAMP, latestMessageTimestampMs),
156+
.putExtra(EXTRA_THREAD_ADDRESS, threadAddress),
149157
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
150158
)
151159
}

app/src/main/java/org/thoughtcrime/securesms/notifications/ThreadBasedNotificationHandler.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,6 @@ abstract class ThreadBasedNotificationHandler(
9292
threadAddress: Address.Conversable,
9393
threadRecipient: Recipient,
9494
threadId: ThreadId,
95-
latestMessageTimestampMs: Long,
9695
messages: List<NotificationCompat.MessagingStyle.Message>,
9796
canReply: Boolean,
9897
silent: Boolean
@@ -166,8 +165,7 @@ abstract class ThreadBasedNotificationHandler(
166165
context.getString(R.string.messageMarkRead),
167166
NotificationActionReceiver.buildMarkReadIntent(
168167
context = context,
169-
threadAddress = threadAddress,
170-
latestMessageTimestampMs = latestMessageTimestampMs
168+
threadAddress = threadAddress
171169
)
172170
).build()
173171
)

0 commit comments

Comments
 (0)