mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2026-01-25 21:41:23 +00:00
Merge branch 'master' of https://github.com/peter-iakovlev/Postbox
This commit is contained in:
@@ -1,5 +1,13 @@
|
||||
import Foundation
|
||||
|
||||
public enum AdditionalMessageHistoryViewData {
|
||||
case cachedPeerData(PeerId)
|
||||
}
|
||||
|
||||
public enum AdditionalMessageHistoryViewDataEntry {
|
||||
case cachedPeerData(PeerId, CachedPeerData?)
|
||||
}
|
||||
|
||||
public struct MessageHistoryViewId: Equatable {
|
||||
let peerId: PeerId
|
||||
let id: Int
|
||||
@@ -163,8 +171,9 @@ final class MutableMessageHistoryView {
|
||||
fileprivate let fillCount: Int
|
||||
|
||||
fileprivate var topTaggedMessages: [MessageId.Namespace: MessageHistoryTopTaggedMessage?]
|
||||
fileprivate var additionalDatas: [AdditionalMessageHistoryViewDataEntry]
|
||||
|
||||
init(id: MessageHistoryViewId, anchorIndex: MessageHistoryAnchorIndex, combinedReadState: CombinedPeerReadState?, earlier: MutableMessageHistoryEntry?, entries: [MutableMessageHistoryEntry], later: MutableMessageHistoryEntry?, tagMask: MessageTags?, count: Int, topTaggedMessages: [MessageId.Namespace: MessageHistoryTopTaggedMessage?]) {
|
||||
init(id: MessageHistoryViewId, anchorIndex: MessageHistoryAnchorIndex, combinedReadState: CombinedPeerReadState?, earlier: MutableMessageHistoryEntry?, entries: [MutableMessageHistoryEntry], later: MutableMessageHistoryEntry?, tagMask: MessageTags?, count: Int, topTaggedMessages: [MessageId.Namespace: MessageHistoryTopTaggedMessage?], additionalDatas: [AdditionalMessageHistoryViewDataEntry]) {
|
||||
self.id = id
|
||||
self.anchorIndex = anchorIndex
|
||||
self.combinedReadState = combinedReadState
|
||||
@@ -175,6 +184,7 @@ final class MutableMessageHistoryView {
|
||||
self.tagMask = tagMask
|
||||
self.fillCount = count
|
||||
self.topTaggedMessages = topTaggedMessages
|
||||
self.additionalDatas = additionalDatas
|
||||
}
|
||||
|
||||
func incrementVersion() {
|
||||
@@ -266,7 +276,7 @@ final class MutableMessageHistoryView {
|
||||
return true
|
||||
}
|
||||
|
||||
func replay(_ operations: [MessageHistoryOperation], holeFillDirections: [MessageIndex: HoleFillDirection], updatedMedia: [MediaId: Media?], context: MutableMessageHistoryViewReplayContext, renderIntermediateMessage: (IntermediateMessage) -> Message) -> Bool {
|
||||
func replay(_ operations: [MessageHistoryOperation], holeFillDirections: [MessageIndex: HoleFillDirection], updatedMedia: [MediaId: Media?], updatedCachedPeerData: [PeerId: CachedPeerData], context: MutableMessageHistoryViewReplayContext, renderIntermediateMessage: (IntermediateMessage) -> Message) -> Bool {
|
||||
let tagMask = self.tagMask
|
||||
let unwrappedTagMask: UInt32 = tagMask?.rawValue ?? 0
|
||||
|
||||
@@ -419,6 +429,16 @@ final class MutableMessageHistoryView {
|
||||
}
|
||||
}
|
||||
|
||||
for i in 0 ..< self.additionalDatas.count {
|
||||
switch self.additionalDatas[i] {
|
||||
case let .cachedPeerData(peerId, data):
|
||||
if let updatedData = updatedCachedPeerData[peerId] {
|
||||
self.additionalDatas[i] = .cachedPeerData(peerId, updatedData)
|
||||
hasChanges = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return hasChanges
|
||||
}
|
||||
|
||||
@@ -663,6 +683,7 @@ public final class MessageHistoryView {
|
||||
public let maxReadIndex: MessageIndex?
|
||||
public let combinedReadState: CombinedPeerReadState?
|
||||
public let topTaggedMessages: [Message]
|
||||
public let additionalData: [AdditionalMessageHistoryViewDataEntry]
|
||||
|
||||
init(_ mutableView: MutableMessageHistoryView) {
|
||||
self.id = mutableView.id
|
||||
@@ -712,6 +733,7 @@ public final class MessageHistoryView {
|
||||
}
|
||||
}
|
||||
self.topTaggedMessages = topTaggedMessages
|
||||
self.additionalData = mutableView.additionalDatas
|
||||
|
||||
self.earlierId = mutableView.earlier?.index
|
||||
self.laterId = mutableView.later?.index
|
||||
|
||||
@@ -979,29 +979,29 @@ public final class Postbox {
|
||||
}
|
||||
}
|
||||
|
||||
public func aroundUnreadMessageHistoryViewForPeerId(_ peerId: PeerId, count: Int, topTaggedMessageIdNamespaces: Set<MessageId.Namespace>, tagMask: MessageTags? = nil) -> Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError> {
|
||||
public func aroundUnreadMessageHistoryViewForPeerId(_ peerId: PeerId, count: Int, topTaggedMessageIdNamespaces: Set<MessageId.Namespace>, tagMask: MessageTags? = nil, additionalData: [AdditionalMessageHistoryViewData]) -> Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError> {
|
||||
return self.modify(userInteractive: true, { modifier -> Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError> in
|
||||
var index = MessageHistoryAnchorIndex(index: MessageIndex.upperBound(peerId: peerId), exact: true)
|
||||
if let maxReadIndex = self.messageHistoryTable.maxReadIndex(peerId) {
|
||||
index = maxReadIndex
|
||||
}
|
||||
return self.syncAroundMessageHistoryViewForPeerId(peerId, index: index.index, count: count, anchorIndex: index, unreadIndex: index.index, fixedCombinedReadState: nil, topTaggedMessageIdNamespaces: topTaggedMessageIdNamespaces, tagMask: tagMask)
|
||||
return self.syncAroundMessageHistoryViewForPeerId(peerId, index: index.index, count: count, anchorIndex: index, unreadIndex: index.index, fixedCombinedReadState: nil, topTaggedMessageIdNamespaces: topTaggedMessageIdNamespaces, tagMask: tagMask, additionalData: additionalData)
|
||||
}) |> switchToLatest
|
||||
}
|
||||
|
||||
public func aroundIdMessageHistoryViewForPeerId(_ peerId: PeerId, count: Int, messageId: MessageId, topTaggedMessageIdNamespaces: Set<MessageId.Namespace>, tagMask: MessageTags? = nil) -> Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError> {
|
||||
public func aroundIdMessageHistoryViewForPeerId(_ peerId: PeerId, count: Int, messageId: MessageId, topTaggedMessageIdNamespaces: Set<MessageId.Namespace>, tagMask: MessageTags? = nil, additionalData: [AdditionalMessageHistoryViewData] = []) -> Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError> {
|
||||
return self.modify { modifier -> Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError> in
|
||||
var index = MessageHistoryAnchorIndex(index: MessageIndex.upperBound(peerId: peerId), exact: true)
|
||||
if let anchorIndex = self.messageHistoryTable.anchorIndex(messageId) {
|
||||
index = anchorIndex
|
||||
}
|
||||
return self.syncAroundMessageHistoryViewForPeerId(peerId, index: index.index, count: count, anchorIndex: index, unreadIndex: index.index, fixedCombinedReadState: nil, topTaggedMessageIdNamespaces: topTaggedMessageIdNamespaces, tagMask: tagMask)
|
||||
return self.syncAroundMessageHistoryViewForPeerId(peerId, index: index.index, count: count, anchorIndex: index, unreadIndex: index.index, fixedCombinedReadState: nil, topTaggedMessageIdNamespaces: topTaggedMessageIdNamespaces, tagMask: tagMask, additionalData: additionalData)
|
||||
} |> switchToLatest
|
||||
}
|
||||
|
||||
public func aroundMessageHistoryViewForPeerId(_ peerId: PeerId, index: MessageIndex, count: Int, anchorIndex: MessageIndex, fixedCombinedReadState: CombinedPeerReadState?, topTaggedMessageIdNamespaces: Set<MessageId.Namespace>, tagMask: MessageTags? = nil) -> Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError> {
|
||||
public func aroundMessageHistoryViewForPeerId(_ peerId: PeerId, index: MessageIndex, count: Int, anchorIndex: MessageIndex, fixedCombinedReadState: CombinedPeerReadState?, topTaggedMessageIdNamespaces: Set<MessageId.Namespace>, tagMask: MessageTags? = nil, additionalData: [AdditionalMessageHistoryViewData] = []) -> Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError> {
|
||||
return self.modify { modifier -> Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError> in
|
||||
return self.syncAroundMessageHistoryViewForPeerId(peerId, index: index, count: count, anchorIndex: MessageHistoryAnchorIndex(index: anchorIndex, exact: true), unreadIndex: nil, fixedCombinedReadState: fixedCombinedReadState, topTaggedMessageIdNamespaces: topTaggedMessageIdNamespaces, tagMask: tagMask)
|
||||
return self.syncAroundMessageHistoryViewForPeerId(peerId, index: index, count: count, anchorIndex: MessageHistoryAnchorIndex(index: anchorIndex, exact: true), unreadIndex: nil, fixedCombinedReadState: fixedCombinedReadState, topTaggedMessageIdNamespaces: topTaggedMessageIdNamespaces, tagMask: tagMask, additionalData: additionalData)
|
||||
} |> switchToLatest
|
||||
}
|
||||
|
||||
@@ -1031,7 +1031,7 @@ public final class Postbox {
|
||||
}
|
||||
}
|
||||
|
||||
private func syncAroundMessageHistoryViewForPeerId(_ peerId: PeerId, index: MessageIndex, count: Int, anchorIndex: MessageHistoryAnchorIndex, unreadIndex: MessageIndex?, fixedCombinedReadState: CombinedPeerReadState?, topTaggedMessageIdNamespaces: Set<MessageId.Namespace>, tagMask: MessageTags? = nil) -> Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError> {
|
||||
private func syncAroundMessageHistoryViewForPeerId(_ peerId: PeerId, index: MessageIndex, count: Int, anchorIndex: MessageHistoryAnchorIndex, unreadIndex: MessageIndex?, fixedCombinedReadState: CombinedPeerReadState?, topTaggedMessageIdNamespaces: Set<MessageId.Namespace>, tagMask: MessageTags?, additionalData: [AdditionalMessageHistoryViewData]) -> Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError> {
|
||||
let startTime = CFAbsoluteTimeGetCurrent()
|
||||
let (entries, earlier, later) = self.fetchAroundHistoryEntries(index, count: count, tagMask: tagMask)
|
||||
print("aroundMessageHistoryViewForPeerId fetchAroundHistoryEntries \((CFAbsoluteTimeGetCurrent() - startTime) * 1000.0) ms")
|
||||
@@ -1054,7 +1054,15 @@ public final class Postbox {
|
||||
}
|
||||
}
|
||||
|
||||
let mutableView = MutableMessageHistoryView(id: MessageHistoryViewId(peerId: peerId, id: self.takeNextViewId()), anchorIndex: anchorIndex, combinedReadState: fixedCombinedReadState ?? self.readStateTable.getCombinedState(peerId), earlier: earlier, entries: entries, later: later, tagMask: tagMask, count: count, topTaggedMessages: topTaggedMessages)
|
||||
var additionalDataEntries: [AdditionalMessageHistoryViewDataEntry] = []
|
||||
for data in additionalData {
|
||||
switch data {
|
||||
case let .cachedPeerData(peerId):
|
||||
additionalDataEntries.append(.cachedPeerData(peerId, self.cachedPeerDataTable.get(peerId)))
|
||||
}
|
||||
}
|
||||
|
||||
let mutableView = MutableMessageHistoryView(id: MessageHistoryViewId(peerId: peerId, id: self.takeNextViewId()), anchorIndex: anchorIndex, combinedReadState: fixedCombinedReadState ?? self.readStateTable.getCombinedState(peerId), earlier: earlier, entries: entries, later: later, tagMask: tagMask, count: count, topTaggedMessages: topTaggedMessages, additionalDatas: additionalDataEntries)
|
||||
mutableView.render(self.renderIntermediateMessage)
|
||||
|
||||
let initialUpdateType: ViewUpdateType
|
||||
|
||||
@@ -240,7 +240,7 @@ final class ViewTracker {
|
||||
for (peerId, bag) in self.messageHistoryViews {
|
||||
var updateHoles = false
|
||||
let operations = transaction.currentOperationsByPeerId[peerId]
|
||||
if operations != nil || !transaction.updatedMedia.isEmpty {
|
||||
if operations != nil || !transaction.updatedMedia.isEmpty || !transaction.currentUpdatedCachedPeerData.isEmpty {
|
||||
updateHoles = true
|
||||
for (mutableView, pipe) in bag.copyItems() {
|
||||
let context = MutableMessageHistoryViewReplayContext()
|
||||
@@ -253,7 +253,7 @@ final class ViewTracker {
|
||||
updateType = .Generic
|
||||
}
|
||||
|
||||
if mutableView.replay(operations ?? [], holeFillDirections: transaction.peerIdsWithFilledHoles[peerId] ?? [:], updatedMedia: transaction.updatedMedia, context: context, renderIntermediateMessage: self.renderMessage) {
|
||||
if mutableView.replay(operations ?? [], holeFillDirections: transaction.peerIdsWithFilledHoles[peerId] ?? [:], updatedMedia: transaction.updatedMedia, updatedCachedPeerData: transaction.currentUpdatedCachedPeerData, context: context, renderIntermediateMessage: self.renderMessage) {
|
||||
mutableView.complete(context: context, fetchEarlier: { index, count in
|
||||
return self.fetchEarlierHistoryEntries(peerId, index, count, mutableView.tagMask)
|
||||
}, fetchLater: { index, count in
|
||||
|
||||
Reference in New Issue
Block a user