From 0a20d69a3d076c083445e043e3d59b0f1e2facdd Mon Sep 17 00:00:00 2001 From: Ali <> Date: Fri, 6 Dec 2019 10:41:16 +0400 Subject: [PATCH] Fix missing call list messages and animations --- .../CallListUI/Sources/CallListCallItem.swift | 12 +- .../Sources/CallListViewTransition.swift | 30 +++-- .../Sources/GlobalMessageTagsView.swift | 106 +++++++++++------- 3 files changed, 91 insertions(+), 57 deletions(-) diff --git a/submodules/CallListUI/Sources/CallListCallItem.swift b/submodules/CallListUI/Sources/CallListCallItem.swift index b0adfc1dd9..3d778b67f7 100644 --- a/submodules/CallListUI/Sources/CallListCallItem.swift +++ b/submodules/CallListUI/Sources/CallListCallItem.swift @@ -104,7 +104,7 @@ class CallListCallItem: ListViewItem { Queue.mainQueue().async { completion(node, { return (nil, { _ in - nodeApply().1(false) + nodeApply(synchronousLoads).1(false) }) }) } @@ -124,7 +124,7 @@ class CallListCallItem: ListViewItem { } Queue.mainQueue().async { completion(nodeLayout, { _ in - apply().1(animated) + apply(false).1(animated) }) } } @@ -250,7 +250,7 @@ class CallListCallItemNode: ItemListRevealOptionsItemNode { let (nodeLayout, nodeApply) = makeLayout(item, params, first, last, firstWithHeader, callListNeighbors(item: item, topItem: previousItem, bottomItem: nextItem)) self.contentSize = nodeLayout.contentSize self.insets = nodeLayout.insets - let _ = nodeApply() + let _ = nodeApply(false) } } @@ -284,7 +284,7 @@ class CallListCallItemNode: ItemListRevealOptionsItemNode { } } - func asyncLayout() -> (_ item: CallListCallItem, _ params: ListViewItemLayoutParams, _ first: Bool, _ last: Bool, _ firstWithHeader: Bool, _ neighbors: ItemListNeighbors) -> (ListViewItemNodeLayout, () -> (Signal?, (Bool) -> Void)) { + func asyncLayout() -> (_ item: CallListCallItem, _ params: ListViewItemLayoutParams, _ first: Bool, _ last: Bool, _ firstWithHeader: Bool, _ neighbors: ItemListNeighbors) -> (ListViewItemNodeLayout, (Bool) -> (Signal?, (Bool) -> Void)) { let makeTitleLayout = TextNode.asyncLayout(self.titleNode) let makeStatusLayout = TextNode.asyncLayout(self.statusNode) let makeDateLayout = TextNode.asyncLayout(self.dateNode) @@ -445,14 +445,14 @@ class CallListCallItemNode: ItemListRevealOptionsItemNode { let contentSize = nodeLayout.contentSize - return (nodeLayout, { [weak self] in + return (nodeLayout, { [weak self] synchronousLoads in if let strongSelf = self { if let peer = item.topMessage.peers[item.topMessage.id.peerId] { var overrideImage: AvatarNodeImageOverride? if peer.isDeleted { overrideImage = .deletedIcon } - strongSelf.avatarNode.setPeer(account: item.account, theme: item.presentationData.theme, peer: peer, overrideImage: overrideImage, emptyColor: item.presentationData.theme.list.mediaPlaceholderColor) + strongSelf.avatarNode.setPeer(account: item.account, theme: item.presentationData.theme, peer: peer, overrideImage: overrideImage, emptyColor: item.presentationData.theme.list.mediaPlaceholderColor, synchronousLoad: synchronousLoads) } return (strongSelf.avatarNode.ready, { [weak strongSelf] animated in diff --git a/submodules/CallListUI/Sources/CallListViewTransition.swift b/submodules/CallListUI/Sources/CallListViewTransition.swift index e9457b2921..09f7e03c96 100644 --- a/submodules/CallListUI/Sources/CallListViewTransition.swift +++ b/submodules/CallListUI/Sources/CallListViewTransition.swift @@ -72,11 +72,21 @@ func preparedCallListNodeViewTransition(from fromView: CallListNodeView?, to toV var stationaryItemRange: (Int, Int)? var scrollToItem: ListViewScrollToItem? + var wasEmpty = false + if let fromView = fromView, fromView.originalView.entries.isEmpty { + wasEmpty = true + } + switch reason { - case .initial: - let _ = options.insert(.LowLatency) + case .initial: + let _ = options.insert(.LowLatency) + let _ = options.insert(.Synchronous) + let _ = options.insert(.PreferSynchronousResourceLoading) + case .interactiveChanges: + if wasEmpty { let _ = options.insert(.Synchronous) - case .interactiveChanges: + let _ = options.insert(.PreferSynchronousResourceLoading) + } else { let _ = options.insert(.AnimateAlpha) if !disableAnimations { let _ = options.insert(.AnimateInsertion) @@ -88,12 +98,14 @@ func preparedCallListNodeViewTransition(from fromView: CallListNodeView?, to toV maxAnimatedInsertionIndex += 1 } } - case .reload: - break - case .reloadAnimated: - let _ = options.insert(.LowLatency) - let _ = options.insert(.Synchronous) - let _ = options.insert(.AnimateCrossfade) + } + case .reload: + break + case .reloadAnimated: + let _ = options.insert(.LowLatency) + let _ = options.insert(.Synchronous) + let _ = options.insert(.AnimateCrossfade) + let _ = options.insert(.PreferSynchronousResourceLoading) } for (index, entry, previousIndex) in indicesAndItems { diff --git a/submodules/Postbox/Sources/GlobalMessageTagsView.swift b/submodules/Postbox/Sources/GlobalMessageTagsView.swift index 0941829082..c52fa1f315 100644 --- a/submodules/Postbox/Sources/GlobalMessageTagsView.swift +++ b/submodules/Postbox/Sources/GlobalMessageTagsView.swift @@ -82,6 +82,7 @@ final class MutableGlobalMessageTagsViewReplayContext { final class MutableGlobalMessageTagsView: MutablePostboxView { private let globalTag: GlobalMessageTags + private let position: MessageIndex private let count: Int private let groupingPredicate: ((Message, Message) -> Bool)? @@ -91,6 +92,7 @@ final class MutableGlobalMessageTagsView: MutablePostboxView { init(postbox: Postbox, globalTag: GlobalMessageTags, position: MessageIndex, count: Int, groupingPredicate: ((Message, Message) -> Bool)?) { self.globalTag = globalTag + self.position = position self.count = count self.groupingPredicate = groupingPredicate @@ -115,63 +117,83 @@ final class MutableGlobalMessageTagsView: MutablePostboxView { let context = MutableGlobalMessageTagsViewReplayContext() + var wasSingleHole = false + if self.entries.count == 1, case .hole = self.entries[0] { + wasSingleHole = true + } + for operation in transaction.currentGlobalTagsOperations { switch operation { - case let .insertMessage(tags, message): + case let .insertMessage(tags, message): + if (self.globalTag.rawValue & tags.rawValue) != 0 { + if self.add(.intermediateMessage(message)) { + hasChanges = true + } + } + case let .insertHole(tags, index): + if (self.globalTag.rawValue & tags.rawValue) != 0 { + if self.add(.hole(index)) { + hasChanges = true + } + } + case let .remove(tagsAndIndices): + var indices = Set() + for (tags, index) in tagsAndIndices { if (self.globalTag.rawValue & tags.rawValue) != 0 { - if self.add(.intermediateMessage(message)) { - hasChanges = true - } + indices.insert(index) } - case let .insertHole(tags, index): - if (self.globalTag.rawValue & tags.rawValue) != 0 { - if self.add(.hole(index)) { - hasChanges = true - } + } + if !indices.isEmpty { + if self.remove(indices, context: context) { + hasChanges = true } - case let .remove(tagsAndIndices): - var indices = Set() - for (tags, index) in tagsAndIndices { - if (self.globalTag.rawValue & tags.rawValue) != 0 { - indices.insert(index) - } - } - if !indices.isEmpty { - if self.remove(indices, context: context) { - hasChanges = true - } - } - case let .updateTimestamp(tags, previousIndex, updatedTimestamp): - if (self.globalTag.rawValue & tags.rawValue) != 0 { - inner: for i in 0 ..< self.entries.count { - let entry = self.entries[i] - if entry.index == previousIndex { - let updatedIndex = MessageIndex(id: entry.index.id, timestamp: updatedTimestamp) - if self.remove(Set([entry.index]), context: context) { + } + case let .updateTimestamp(tags, previousIndex, updatedTimestamp): + if (self.globalTag.rawValue & tags.rawValue) != 0 { + inner: for i in 0 ..< self.entries.count { + let entry = self.entries[i] + if entry.index == previousIndex { + let updatedIndex = MessageIndex(id: entry.index.id, timestamp: updatedTimestamp) + if self.remove(Set([entry.index]), context: context) { + hasChanges = true + } + switch entry { + case .hole: + if self.add(.hole(updatedIndex)) { hasChanges = true } - switch entry { - case .hole: - if self.add(.hole(updatedIndex)) { - hasChanges = true - } - case let .intermediateMessage(message): - if self.add(.intermediateMessage(IntermediateMessage(stableId: message.stableId, stableVersion: message.stableVersion, id: message.id, globallyUniqueId: message.globallyUniqueId, groupingKey: message.groupingKey, groupInfo: message.groupInfo, timestamp: updatedTimestamp, flags: message.flags, tags: message.tags, globalTags: message.globalTags, localTags: message.localTags, forwardInfo: message.forwardInfo, authorId: message.authorId, text: message.text, attributesData: message.attributesData, embeddedMediaData: message.embeddedMediaData, referencedMedia: message.referencedMedia))) { - hasChanges = true - } - case let .message(message): - if self.add(.message(Message(stableId: message.stableId, stableVersion: message.stableVersion, id: message.id, globallyUniqueId: message.globallyUniqueId, groupingKey: message.groupingKey, groupInfo: message.groupInfo, timestamp: updatedTimestamp, flags: message.flags, tags: message.tags, globalTags: message.globalTags, localTags: message.localTags, forwardInfo: message.forwardInfo, author: message.author, text: message.text, attributes: message.attributes, media: message.media, peers: message.peers, associatedMessages: message.associatedMessages, associatedMessageIds: message.associatedMessageIds))) { - hasChanges = true - } + case let .intermediateMessage(message): + if self.add(.intermediateMessage(IntermediateMessage(stableId: message.stableId, stableVersion: message.stableVersion, id: message.id, globallyUniqueId: message.globallyUniqueId, groupingKey: message.groupingKey, groupInfo: message.groupInfo, timestamp: updatedTimestamp, flags: message.flags, tags: message.tags, globalTags: message.globalTags, localTags: message.localTags, forwardInfo: message.forwardInfo, authorId: message.authorId, text: message.text, attributesData: message.attributesData, embeddedMediaData: message.embeddedMediaData, referencedMedia: message.referencedMedia))) { + hasChanges = true + } + case let .message(message): + if self.add(.message(Message(stableId: message.stableId, stableVersion: message.stableVersion, id: message.id, globallyUniqueId: message.globallyUniqueId, groupingKey: message.groupingKey, groupInfo: message.groupInfo, timestamp: updatedTimestamp, flags: message.flags, tags: message.tags, globalTags: message.globalTags, localTags: message.localTags, forwardInfo: message.forwardInfo, author: message.author, text: message.text, attributes: message.attributes, media: message.media, peers: message.peers, associatedMessages: message.associatedMessages, associatedMessageIds: message.associatedMessageIds))) { + hasChanges = true } - break inner } + break inner } } + } } } if hasChanges || !context.empty() { + if wasSingleHole { + let (entries, lower, upper) = postbox.messageHistoryTable.entriesAround(globalTagMask: self.globalTag, index: self.position, count: self.count) + + self.entries = entries.map { entry -> InternalGlobalMessageTagsEntry in + switch entry { + case let .message(message): + return .intermediateMessage(message) + case let .hole(index): + return .hole(index) + } + } + self.earlier = lower + self.later = upper + } + self.complete(postbox: postbox, context: context) self.render(postbox: postbox)