Fix missing call list messages and animations

This commit is contained in:
Ali 2019-12-06 10:41:16 +04:00
parent 74ad5740ee
commit 0a20d69a3d
3 changed files with 91 additions and 57 deletions

View File

@ -104,7 +104,7 @@ class CallListCallItem: ListViewItem {
Queue.mainQueue().async { Queue.mainQueue().async {
completion(node, { completion(node, {
return (nil, { _ in return (nil, { _ in
nodeApply().1(false) nodeApply(synchronousLoads).1(false)
}) })
}) })
} }
@ -124,7 +124,7 @@ class CallListCallItem: ListViewItem {
} }
Queue.mainQueue().async { Queue.mainQueue().async {
completion(nodeLayout, { _ in 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)) let (nodeLayout, nodeApply) = makeLayout(item, params, first, last, firstWithHeader, callListNeighbors(item: item, topItem: previousItem, bottomItem: nextItem))
self.contentSize = nodeLayout.contentSize self.contentSize = nodeLayout.contentSize
self.insets = nodeLayout.insets 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<Void, NoError>?, (Bool) -> Void)) { func asyncLayout() -> (_ item: CallListCallItem, _ params: ListViewItemLayoutParams, _ first: Bool, _ last: Bool, _ firstWithHeader: Bool, _ neighbors: ItemListNeighbors) -> (ListViewItemNodeLayout, (Bool) -> (Signal<Void, NoError>?, (Bool) -> Void)) {
let makeTitleLayout = TextNode.asyncLayout(self.titleNode) let makeTitleLayout = TextNode.asyncLayout(self.titleNode)
let makeStatusLayout = TextNode.asyncLayout(self.statusNode) let makeStatusLayout = TextNode.asyncLayout(self.statusNode)
let makeDateLayout = TextNode.asyncLayout(self.dateNode) let makeDateLayout = TextNode.asyncLayout(self.dateNode)
@ -445,14 +445,14 @@ class CallListCallItemNode: ItemListRevealOptionsItemNode {
let contentSize = nodeLayout.contentSize let contentSize = nodeLayout.contentSize
return (nodeLayout, { [weak self] in return (nodeLayout, { [weak self] synchronousLoads in
if let strongSelf = self { if let strongSelf = self {
if let peer = item.topMessage.peers[item.topMessage.id.peerId] { if let peer = item.topMessage.peers[item.topMessage.id.peerId] {
var overrideImage: AvatarNodeImageOverride? var overrideImage: AvatarNodeImageOverride?
if peer.isDeleted { if peer.isDeleted {
overrideImage = .deletedIcon 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 return (strongSelf.avatarNode.ready, { [weak strongSelf] animated in

View File

@ -72,11 +72,21 @@ func preparedCallListNodeViewTransition(from fromView: CallListNodeView?, to toV
var stationaryItemRange: (Int, Int)? var stationaryItemRange: (Int, Int)?
var scrollToItem: ListViewScrollToItem? var scrollToItem: ListViewScrollToItem?
var wasEmpty = false
if let fromView = fromView, fromView.originalView.entries.isEmpty {
wasEmpty = true
}
switch reason { switch reason {
case .initial: case .initial:
let _ = options.insert(.LowLatency) let _ = options.insert(.LowLatency)
let _ = options.insert(.Synchronous)
let _ = options.insert(.PreferSynchronousResourceLoading)
case .interactiveChanges:
if wasEmpty {
let _ = options.insert(.Synchronous) let _ = options.insert(.Synchronous)
case .interactiveChanges: let _ = options.insert(.PreferSynchronousResourceLoading)
} else {
let _ = options.insert(.AnimateAlpha) let _ = options.insert(.AnimateAlpha)
if !disableAnimations { if !disableAnimations {
let _ = options.insert(.AnimateInsertion) let _ = options.insert(.AnimateInsertion)
@ -88,12 +98,14 @@ func preparedCallListNodeViewTransition(from fromView: CallListNodeView?, to toV
maxAnimatedInsertionIndex += 1 maxAnimatedInsertionIndex += 1
} }
} }
case .reload: }
break case .reload:
case .reloadAnimated: break
let _ = options.insert(.LowLatency) case .reloadAnimated:
let _ = options.insert(.Synchronous) let _ = options.insert(.LowLatency)
let _ = options.insert(.AnimateCrossfade) let _ = options.insert(.Synchronous)
let _ = options.insert(.AnimateCrossfade)
let _ = options.insert(.PreferSynchronousResourceLoading)
} }
for (index, entry, previousIndex) in indicesAndItems { for (index, entry, previousIndex) in indicesAndItems {

View File

@ -82,6 +82,7 @@ final class MutableGlobalMessageTagsViewReplayContext {
final class MutableGlobalMessageTagsView: MutablePostboxView { final class MutableGlobalMessageTagsView: MutablePostboxView {
private let globalTag: GlobalMessageTags private let globalTag: GlobalMessageTags
private let position: MessageIndex
private let count: Int private let count: Int
private let groupingPredicate: ((Message, Message) -> Bool)? 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)?) { init(postbox: Postbox, globalTag: GlobalMessageTags, position: MessageIndex, count: Int, groupingPredicate: ((Message, Message) -> Bool)?) {
self.globalTag = globalTag self.globalTag = globalTag
self.position = position
self.count = count self.count = count
self.groupingPredicate = groupingPredicate self.groupingPredicate = groupingPredicate
@ -115,63 +117,83 @@ final class MutableGlobalMessageTagsView: MutablePostboxView {
let context = MutableGlobalMessageTagsViewReplayContext() let context = MutableGlobalMessageTagsViewReplayContext()
var wasSingleHole = false
if self.entries.count == 1, case .hole = self.entries[0] {
wasSingleHole = true
}
for operation in transaction.currentGlobalTagsOperations { for operation in transaction.currentGlobalTagsOperations {
switch operation { 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<MessageIndex>()
for (tags, index) in tagsAndIndices {
if (self.globalTag.rawValue & tags.rawValue) != 0 { if (self.globalTag.rawValue & tags.rawValue) != 0 {
if self.add(.intermediateMessage(message)) { indices.insert(index)
hasChanges = true
}
} }
case let .insertHole(tags, index): }
if (self.globalTag.rawValue & tags.rawValue) != 0 { if !indices.isEmpty {
if self.add(.hole(index)) { if self.remove(indices, context: context) {
hasChanges = true hasChanges = true
}
} }
case let .remove(tagsAndIndices): }
var indices = Set<MessageIndex>() case let .updateTimestamp(tags, previousIndex, updatedTimestamp):
for (tags, index) in tagsAndIndices { if (self.globalTag.rawValue & tags.rawValue) != 0 {
if (self.globalTag.rawValue & tags.rawValue) != 0 { inner: for i in 0 ..< self.entries.count {
indices.insert(index) let entry = self.entries[i]
} if entry.index == previousIndex {
} let updatedIndex = MessageIndex(id: entry.index.id, timestamp: updatedTimestamp)
if !indices.isEmpty { if self.remove(Set([entry.index]), context: context) {
if self.remove(indices, context: context) { hasChanges = true
hasChanges = true }
} switch entry {
} case .hole:
case let .updateTimestamp(tags, previousIndex, updatedTimestamp): if self.add(.hole(updatedIndex)) {
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 hasChanges = true
} }
switch entry { case let .intermediateMessage(message):
case .hole: 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))) {
if self.add(.hole(updatedIndex)) { hasChanges = true
hasChanges = true }
} case let .message(message):
case let .intermediateMessage(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))) {
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
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 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.complete(postbox: postbox, context: context)
self.render(postbox: postbox) self.render(postbox: postbox)