Remove workarounds for the phantom mark-as-read bug
This commit is contained in:
parent
22c72f5973
commit
e104932029
@ -1885,7 +1885,6 @@
|
||||
D994C7C92C45D0B9009ECEDA /* MessageBackupContactTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = D994C7C52C45D07F009ECEDA /* MessageBackupContactTest.swift */; };
|
||||
D994C7CA2C45D0BF009ECEDA /* MessageBackupDistributionListTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = D994C7C72C45D0B4009ECEDA /* MessageBackupDistributionListTest.swift */; };
|
||||
D994C7CE2C45D100009ECEDA /* MessageBackupExpirationTimerChatUpdateTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = D994C7CD2C45D100009ECEDA /* MessageBackupExpirationTimerChatUpdateTest.swift */; };
|
||||
D994C7CF2C45D152009ECEDA /* MessageBackupSimpleChatUpdateTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = D994C7CB2C45D0D9009ECEDA /* MessageBackupSimpleChatUpdateTest.swift */; };
|
||||
D994C7D12C45D24F009ECEDA /* MessageBackupProfileChangeChatUpdateArchiver.swift in Sources */ = {isa = PBXBuildFile; fileRef = D994C7D02C45D24F009ECEDA /* MessageBackupProfileChangeChatUpdateArchiver.swift */; };
|
||||
D994C7D42C45E765009ECEDA /* profile-change-chat-update-message.jsonproto in Resources */ = {isa = PBXBuildFile; fileRef = D994C7D22C45E764009ECEDA /* profile-change-chat-update-message.jsonproto */; };
|
||||
D994C7D52C45E765009ECEDA /* profile-change-chat-update-message.binproto in Resources */ = {isa = PBXBuildFile; fileRef = D994C7D32C45E764009ECEDA /* profile-change-chat-update-message.binproto */; };
|
||||
@ -1904,7 +1903,6 @@
|
||||
D99ABC742A3D0BE10034CD3B /* BitmapsImageParsingTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = D99ABC722A3D0BBB0034CD3B /* BitmapsImageParsingTest.swift */; };
|
||||
D99ABC782A3D132D0034CD3B /* blue-rectangle.png in Resources */ = {isa = PBXBuildFile; fileRef = D99ABC762A3D132D0034CD3B /* blue-rectangle.png */; };
|
||||
D99ABC7A2A3D1D710034CD3B /* semitransparent.png in Resources */ = {isa = PBXBuildFile; fileRef = D99ABC792A3D1D710034CD3B /* semitransparent.png */; };
|
||||
D99C25A22C2A18C1001B2012 /* ConversationViewIsSelectedDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D99C25A12C2A18C1001B2012 /* ConversationViewIsSelectedDelegate.swift */; };
|
||||
D99D960F292871C600D5028B /* DonateViewController+OneTimePaypalDonation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D99D960E292871C600D5028B /* DonateViewController+OneTimePaypalDonation.swift */; };
|
||||
D9A3E22B2A0D633500E2A8B5 /* UsernameLookupRecordTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = D925F56F298DF41B00158EE4 /* UsernameLookupRecordTest.swift */; };
|
||||
D9A3E2302A0DABDF00E2A8B5 /* UsernameQuerier.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9A3E22F2A0DABDF00E2A8B5 /* UsernameQuerier.swift */; };
|
||||
@ -4959,7 +4957,6 @@
|
||||
D99ABC722A3D0BBB0034CD3B /* BitmapsImageParsingTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BitmapsImageParsingTest.swift; sourceTree = "<group>"; };
|
||||
D99ABC762A3D132D0034CD3B /* blue-rectangle.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "blue-rectangle.png"; sourceTree = "<group>"; };
|
||||
D99ABC792A3D1D710034CD3B /* semitransparent.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = semitransparent.png; sourceTree = "<group>"; };
|
||||
D99C25A12C2A18C1001B2012 /* ConversationViewIsSelectedDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConversationViewIsSelectedDelegate.swift; sourceTree = "<group>"; };
|
||||
D99D960E292871C600D5028B /* DonateViewController+OneTimePaypalDonation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DonateViewController+OneTimePaypalDonation.swift"; sourceTree = "<group>"; };
|
||||
D9A3E22F2A0DABDF00E2A8B5 /* UsernameQuerier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UsernameQuerier.swift; sourceTree = "<group>"; };
|
||||
D9A81C6A2BAA54FC00C07D2B /* CallRecordSyncMessageConversationIdAdapter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CallRecordSyncMessageConversationIdAdapter.swift; sourceTree = "<group>"; };
|
||||
@ -6290,7 +6287,6 @@
|
||||
88928A70264099EC009C9B30 /* ConversationViewController+VoiceMessage.swift */,
|
||||
888B6D4C25B2523700E2A662 /* ConversationViewController+Wallpaper.swift */,
|
||||
34A4D88C267A363A00A794E7 /* ConversationViewController.swift */,
|
||||
D99C25A12C2A18C1001B2012 /* ConversationViewIsSelectedDelegate.swift */,
|
||||
3498AC9E25190E8B00B1F315 /* ConversationViewLayout.swift */,
|
||||
50EF8DCB2A189B3000A00935 /* ConversationViewModel.swift */,
|
||||
348815CF25545C0A00D4F4C4 /* CVAttachments.swift */,
|
||||
@ -13417,7 +13413,6 @@
|
||||
88928A71264099EC009C9B30 /* ConversationViewController+VoiceMessage.swift in Sources */,
|
||||
888B6D4D25B2523800E2A662 /* ConversationViewController+Wallpaper.swift in Sources */,
|
||||
34A4D88D267A363A00A794E7 /* ConversationViewController.swift in Sources */,
|
||||
D99C25A22C2A18C1001B2012 /* ConversationViewIsSelectedDelegate.swift in Sources */,
|
||||
3498AC9F25190E8C00B1F315 /* ConversationViewLayout.swift in Sources */,
|
||||
50EF8DCC2A189B3000A00935 /* ConversationViewModel.swift in Sources */,
|
||||
50733B202BAD03E400CEEC1F /* CreateCallLinkViewController.swift in Sources */,
|
||||
|
||||
@ -340,8 +340,6 @@ extension ConversationViewController {
|
||||
public func startReadTimer(caller: String = #function) {
|
||||
AssertIsOnMainThread()
|
||||
|
||||
markAsReadLogger.info("Starting read timer for \(caller).")
|
||||
|
||||
readTimer?.invalidate()
|
||||
let readTimer = Timer(timeInterval: 0.1, repeats: true) { [weak self] timer in
|
||||
guard let self else {
|
||||
@ -371,8 +369,6 @@ extension ConversationViewController {
|
||||
public func cancelReadTimer(caller: String = #function) {
|
||||
AssertIsOnMainThread()
|
||||
|
||||
markAsReadLogger.info("Canceling read timer for \(caller).")
|
||||
|
||||
readTimer?.invalidate()
|
||||
self.readTimer = nil
|
||||
}
|
||||
@ -444,22 +440,6 @@ extension ConversationViewController {
|
||||
public func markVisibleMessagesAsRead(caller: String = #function) {
|
||||
AssertIsOnMainThread()
|
||||
|
||||
guard
|
||||
let isSelectedDelegate,
|
||||
isSelectedDelegate.isConversationViewSelected(self)
|
||||
else {
|
||||
/// We've seen reports of conversation views marking messages as
|
||||
/// read while users are on the chat list, which is to say even when
|
||||
/// the given conversation isn't "selected". (We're not sure why,
|
||||
/// although we suspect that something is holding onto a reference
|
||||
/// to a CVC it shouldn't.)
|
||||
///
|
||||
/// This workaround confirms that we are, in fact, selected before
|
||||
/// trying to mark messages as read.
|
||||
markAsReadLogger.warn("Trying to mark visible messages as read, but conversation view is not selected! \(caller)")
|
||||
return
|
||||
}
|
||||
|
||||
guard
|
||||
let navigationController,
|
||||
navigationController.topViewController === self
|
||||
@ -483,8 +463,6 @@ extension ConversationViewController {
|
||||
let lastVisibleSortId = self.lastVisibleSortId
|
||||
let isShowingUnreadMessage = lastVisibleSortId > self.lastSortIdMarkedRead
|
||||
if !self.isMarkingAsRead && isShowingUnreadMessage {
|
||||
markAsReadLogger.info("Marking as read for \(caller).")
|
||||
|
||||
self.isMarkingAsRead = true
|
||||
|
||||
Self.receiptManager.markAsReadLocally(
|
||||
|
||||
@ -44,23 +44,10 @@ public final class ConversationViewController: OWSViewController {
|
||||
public let collectionView: ConversationCollectionView
|
||||
public let searchController: ConversationSearchController
|
||||
|
||||
/// A delegate we can ask about our visibility to the user. If the delegate
|
||||
/// is `nil`, we should assume we are not visible.
|
||||
public weak var isSelectedDelegate: ConversationViewIsSelectedDelegate?
|
||||
|
||||
var selectionToolbar: MessageActionsToolbar?
|
||||
|
||||
var otherUsersProfileDidChangeEvent: DebouncedEvent?
|
||||
|
||||
class MarkAsReadLogger: PrefixedLogger {
|
||||
init(thread: TSThread) {
|
||||
super.init(prefix: "[MarkAsRead]", suffix: thread.uniqueId)
|
||||
}
|
||||
}
|
||||
|
||||
// [MarkAsRead] TODO: using this logger to track down the phantom "mark as read" bug. Remove once addressed.
|
||||
let markAsReadLogger: MarkAsReadLogger
|
||||
|
||||
/// See `ConversationViewController+OWS.updateContentInsetsDebounced`
|
||||
lazy var updateContentInsetsEvent = DebouncedEvents.build(
|
||||
mode: .lastOnly,
|
||||
@ -76,7 +63,6 @@ public final class ConversationViewController: OWSViewController {
|
||||
|
||||
public static func load(
|
||||
threadViewModel: ThreadViewModel,
|
||||
isSelectedDelegate: (any ConversationViewIsSelectedDelegate)?,
|
||||
action: ConversationViewAction,
|
||||
focusMessageId: String?,
|
||||
tx: SDSAnyReadTransaction
|
||||
@ -127,7 +113,6 @@ public final class ConversationViewController: OWSViewController {
|
||||
chatColor: chatColor,
|
||||
wallpaperViewBuilder: wallpaperViewBuilder
|
||||
)
|
||||
cvc.isSelectedDelegate = isSelectedDelegate
|
||||
|
||||
return cvc
|
||||
}
|
||||
@ -173,8 +158,6 @@ public final class ConversationViewController: OWSViewController {
|
||||
self.collectionView = ConversationCollectionView(frame: .zero, collectionViewLayout: self.layout)
|
||||
self.searchController = ConversationSearchController(thread: threadViewModel.threadRecord)
|
||||
|
||||
self.markAsReadLogger = MarkAsReadLogger(thread: threadViewModel.threadRecord)
|
||||
|
||||
super.init()
|
||||
|
||||
self.viewState.delegate = self
|
||||
|
||||
@ -1,24 +0,0 @@
|
||||
//
|
||||
// Copyright 2024 Signal Messenger, LLC
|
||||
// SPDX-License-Identifier: AGPL-3.0-only
|
||||
//
|
||||
|
||||
/// Responsible for telling a ``ConversationViewController`` if it is currently
|
||||
/// selected by the user.
|
||||
///
|
||||
/// - Note
|
||||
/// Even if a given conversation is selected, it may have additionally presented
|
||||
/// other views (such as conversation settings) on top of itself.
|
||||
public protocol ConversationViewIsSelectedDelegate: AnyObject {
|
||||
func isConversationViewSelected(_ conversationView: ConversationViewController) -> Bool
|
||||
}
|
||||
|
||||
extension ConversationSplitViewController: ConversationViewIsSelectedDelegate {
|
||||
func isConversationViewSelected(_ conversationView: ConversationViewController) -> Bool {
|
||||
guard let selectedConversationViewController else {
|
||||
return false
|
||||
}
|
||||
|
||||
return selectedConversationViewController === conversationView
|
||||
}
|
||||
}
|
||||
@ -171,7 +171,6 @@ extension ChatListViewController {
|
||||
let vc = databaseStorage.read { tx in
|
||||
ConversationViewController.load(
|
||||
threadViewModel: threadViewModel,
|
||||
isSelectedDelegate: nil,
|
||||
action: .none,
|
||||
focusMessageId: nil,
|
||||
tx: tx
|
||||
|
||||
@ -168,7 +168,6 @@ class ConversationSplitViewController: UISplitViewController, ConversationSplit
|
||||
let vc = databaseStorage.read { tx in
|
||||
ConversationViewController.load(
|
||||
threadViewModel: ThreadViewModel(thread: thread, forChatList: false, transaction: tx),
|
||||
isSelectedDelegate: self,
|
||||
action: action,
|
||||
focusMessageId: focusMessageId,
|
||||
tx: tx
|
||||
|
||||
Loading…
Reference in New Issue
Block a user