@@ -1796,6 +1796,18 @@ class ChatViewModel @AssistedInject constructor(
17961796 fun advanceLocalLastReadMessageIfNeeded (messageId : Int ) {
17971797 Log .d(TAG , " advanceLocalLastReadMessageIfNeeded, messageId: $messageId " )
17981798 Log .d(TAG , " advanceLocalLastReadMessageIfNeeded, localLastReadMessage: $localLastReadMessage " )
1799+
1800+ val newestKnownRealMessageId = _uiState .value.conversation?.lastMessage?.id
1801+
1802+ if (! isPlausibleLastReadMessageId(messageId, newestKnownRealMessageId)) {
1803+ logger.w(
1804+ TAG ,
1805+ " advanceLocalLastReadMessageIfNeeded, messageId ($messageId ) is implausibly higher than the " +
1806+ " conversation's newest known message id ($newestKnownRealMessageId ). We won't advance."
1807+ )
1808+ return
1809+ }
1810+
17991811 if (localLastReadMessage < messageId && - 1 < messageId) {
18001812 Log .d(TAG , " advanceLocalLastReadMessageIfNeeded, setting localLastReadMessage to $messageId " )
18011813 localLastReadMessage = messageId
@@ -2390,7 +2402,7 @@ class ChatViewModel @AssistedInject constructor(
23902402 }
23912403
23922404 companion object {
2393- private val TAG = ChatViewModel ::class .simpleName
2405+ private val TAG = ChatViewModel ::class .java. simpleName
23942406 const val JOIN_ROOM_RETRY_COUNT : Long = 3
23952407 const val HTTP_CODE_OK : Int = 200
23962408 private const val CONVERSATION_AND_USER_FLOW_SHARING_TIMEOUT_MS = 5_000L
@@ -2406,6 +2418,11 @@ class ChatViewModel @AssistedInject constructor(
24062418 private const val LOAD_MORE_MESSAGES_LIMIT = 100
24072419 private const val POST_UPLOAD_FETCH_MAX_ATTEMPTS = 4
24082420 private const val POST_UPLOAD_FETCH_RETRY_DELAY_MS = 1_500L
2421+
2422+ private const val PLAUSIBLE_MESSAGE_ID_BUFFER = 10_000L
2423+
2424+ fun isPlausibleLastReadMessageId (messageId : Int , newestKnownRealMessageId : Long? ): Boolean =
2425+ newestKnownRealMessageId == null || messageId <= newestKnownRealMessageId + PLAUSIBLE_MESSAGE_ID_BUFFER
24092426 }
24102427
24112428 sealed class OutOfOfficeUIState {
0 commit comments