diff --git a/Postbox/ChatListTable.swift b/Postbox/ChatListTable.swift index 96d27a3ca8..15fa052855 100644 --- a/Postbox/ChatListTable.swift +++ b/Postbox/ChatListTable.swift @@ -240,13 +240,11 @@ final class ChatListTable: Table { } } - func getPinnedItemIds(messageHistoryTable: MessageHistoryTable, peerChatInterfaceStateTable: PeerChatInterfaceStateTable) -> [PinnedItemId] { + func getPinnedItemIds(groupId: PeerGroupId?, messageHistoryTable: MessageHistoryTable, peerChatInterfaceStateTable: PeerChatInterfaceStateTable) -> [PinnedItemId] { var itemIds: [PinnedItemId] = [] - self.valueBox.range(self.table, start: self.upperBound(groupId: nil), end: self.key(groupId: nil, index: ChatListIndex(pinningIndex: UInt16.max - 1, messageIndex: MessageIndex.absoluteUpperBound()), type: .message).successor, values: { key, value in - let entry = readEntry(groupId: nil, messageHistoryTable: messageHistoryTable, peerChatInterfaceStateTable: peerChatInterfaceStateTable, key: key, value: value) + self.valueBox.range(self.table, start: self.upperBound(groupId: groupId), end: self.key(groupId: groupId, index: ChatListIndex(pinningIndex: UInt16.max - 1, messageIndex: MessageIndex.absoluteUpperBound()), type: .message).successor, values: { key, value in + let entry = readEntry(groupId: groupId, messageHistoryTable: messageHistoryTable, peerChatInterfaceStateTable: peerChatInterfaceStateTable, key: key, value: value) switch entry { - /*case let .groupReference(groupId, _): - itemIds.append(.group(groupId))*/ case let .message(index, _, _): itemIds.append(.peer(index.messageIndex.id.peerId)) default: @@ -257,9 +255,9 @@ final class ChatListTable: Table { return itemIds } - func setPinnedItemIds(_ itemIds: [PinnedItemId], updatedChatListInclusions: inout [PeerId: PeerChatListInclusion], updatedChatListGroupInclusions: inout [PeerGroupId: GroupChatListInclusion], messageHistoryTable: MessageHistoryTable, peerChatInterfaceStateTable: PeerChatInterfaceStateTable) { + func setPinnedItemIds(groupId: PeerGroupId?, itemIds: [PinnedItemId], updatedChatListInclusions: inout [PeerId: PeerChatListInclusion], updatedChatListGroupInclusions: inout [PeerGroupId: GroupChatListInclusion], messageHistoryTable: MessageHistoryTable, peerChatInterfaceStateTable: PeerChatInterfaceStateTable) { let updatedIds = Set(itemIds) - for itemId in self.getPinnedItemIds(messageHistoryTable: messageHistoryTable, peerChatInterfaceStateTable: peerChatInterfaceStateTable) { + for itemId in self.getPinnedItemIds(groupId: groupId, messageHistoryTable: messageHistoryTable, peerChatInterfaceStateTable: peerChatInterfaceStateTable) { if !updatedIds.contains(itemId) { switch itemId { case let .peer(peerId): diff --git a/Postbox/ChatListView.swift b/Postbox/ChatListView.swift index 16d90df8f4..6cef7bde75 100644 --- a/Postbox/ChatListView.swift +++ b/Postbox/ChatListView.swift @@ -46,6 +46,7 @@ public struct ChatListMessageTagSummaryInfo: Equatable { public struct ChatListGroupReferenceEntry: Equatable { public let groupId: PeerGroupId + public let renderedPeer: RenderedPeer public let message: Message? public let unreadState: ChatListTotalUnreadState @@ -56,6 +57,9 @@ public struct ChatListGroupReferenceEntry: Equatable { if lhs.unreadState != rhs.unreadState { return false } + if lhs.renderedPeer != rhs.renderedPeer { + return false + } if lhs.message?.stableVersion != rhs.message?.stableVersion { return false } @@ -331,11 +335,54 @@ final class MutableChatListView { self.groupEntries.removeAll() for groupId in postbox.chatListTable.existingGroups() { var upperBound: (ChatListIndex, Bool)? + var foundMessage: IntermediateMessage? + var foundPeerWithIndex: (PeerId, MessageIndex)? inner: while true { if let entry = postbox.chatListTable.earlierEntries(groupId: groupId, index: upperBound, messageHistoryTable: postbox.messageHistoryTable, peerChatInterfaceStateTable: postbox.peerChatInterfaceStateTable, count: 1).first { - if case let .message(_, maybeMessage, _) = entry, let message = maybeMessage { - self.groupEntries.append(ChatListGroupReferenceEntry(groupId: groupId, message: postbox.messageHistoryTable.renderMessage(message, peerTable: postbox.peerTable), unreadState: postbox.groupMessageStatsTable.get(groupId: groupId))) - break inner + var currentTopIndex: MessageIndex? + if let (_, foundIndex) = foundPeerWithIndex { + currentTopIndex = foundIndex + } + if let foundMessageValue = foundMessage { + if let currentTopIndexValue = currentTopIndex { + if foundMessageValue.index > currentTopIndexValue { + currentTopIndex = foundMessageValue.index + } + } else { + currentTopIndex = foundMessageValue.index + } + } + + if case let .message(index, maybeMessage, _) = entry { + if let message = maybeMessage { + if let currentTopIndex = currentTopIndex { + if message.index > currentTopIndex { + foundMessage = message + foundPeerWithIndex = nil + } + } else { + foundMessage = message + foundPeerWithIndex = nil + } + if index.pinningIndex == nil { + break inner + } + upperBound = (entry.index, true) + } else { + if let currentTopIndex = currentTopIndex { + if index.messageIndex > currentTopIndex { + foundMessage = nil + foundPeerWithIndex = (index.messageIndex.id.peerId, index.messageIndex) + } + } else { + foundMessage = nil + foundPeerWithIndex = (index.messageIndex.id.peerId, index.messageIndex) + } + if index.pinningIndex == nil { + break inner + } + upperBound = (entry.index.predecessor, true) + } } else { upperBound = (entry.index, false) } @@ -343,6 +390,24 @@ final class MutableChatListView { break inner } } + + if let peerId = foundMessage?.id.peerId ?? foundPeerWithIndex?.0, let peer = postbox.peerTable.get(peerId) { + var peers = SimpleDictionary() + peers[peer.id] = peer + if let associatedPeerId = peer.associatedPeerId { + if let associatedPeer = postbox.peerTable.get(associatedPeerId) { + peers[associatedPeer.id] = associatedPeer + } + } + + let renderedPeer = RenderedPeer(peerId: peerId, peers: peers) + + if let message = foundMessage { + self.groupEntries.append(ChatListGroupReferenceEntry(groupId: groupId, renderedPeer: renderedPeer, message: postbox.messageHistoryTable.renderMessage(message, peerTable: postbox.peerTable), unreadState: postbox.groupMessageStatsTable.get(groupId: groupId))) + } else if let (peerId, _) = foundPeerWithIndex { + self.groupEntries.append(ChatListGroupReferenceEntry(groupId: groupId, renderedPeer: renderedPeer, message: nil, unreadState: postbox.groupMessageStatsTable.get(groupId: groupId))) + } + } } } @@ -418,7 +483,7 @@ final class MutableChatListView { } else { for i in 0 ..< self.groupEntries.count { if let updatedState = transaction.currentUpdatedTotalUnreadStates[WrappedPeerGroupId(groupId: self.groupEntries[i].groupId)] { - self.groupEntries[i] = ChatListGroupReferenceEntry(groupId: self.groupEntries[i].groupId, message: self.groupEntries[i].message, unreadState: updatedState) + self.groupEntries[i] = ChatListGroupReferenceEntry(groupId: self.groupEntries[i].groupId, renderedPeer: self.groupEntries[i].renderedPeer, message: self.groupEntries[i].message, unreadState: updatedState) hasChanges = true } } diff --git a/Postbox/MessageHistoryView.swift b/Postbox/MessageHistoryView.swift index 48e0a20b05..a5e0c24c45 100644 --- a/Postbox/MessageHistoryView.swift +++ b/Postbox/MessageHistoryView.swift @@ -3,7 +3,6 @@ import Foundation public struct MessageHistoryViewPeerHole: Equatable, Hashable { public let peerId: PeerId public let namespace: MessageId.Namespace - public let indices: IndexSet } public enum MessageHistoryViewHole: Equatable, Hashable { @@ -178,16 +177,6 @@ public struct MessageHistoryEntry: Comparable { } } -final class MutableMessageHistoryViewReplayContext { - var invalidEarlier: Bool = false - var invalidLater: Bool = false - var removedEntries: Bool = false - - func empty() -> Bool { - return !self.removedEntries && !invalidEarlier && !invalidLater - } -} - enum MessageHistoryTopTaggedMessage { case message(Message) case intermediate(IntermediateMessage) @@ -276,7 +265,7 @@ public enum MessageHistoryViewReadState { case peer([PeerId: CombinedPeerReadState]) } -public enum HistoryViewInputAnchor { +public enum HistoryViewInputAnchor: Equatable { case lowerBound case upperBound case message(MessageId) @@ -299,7 +288,7 @@ final class MutableMessageHistoryView { fileprivate var topTaggedMessages: [MessageId.Namespace: MessageHistoryTopTaggedMessage?] fileprivate var additionalDatas: [AdditionalMessageHistoryViewDataEntry] - fileprivate var sampledState: HistoryViewSample + fileprivate(set) var sampledState: HistoryViewSample init(postbox: Postbox, orderStatistics: MessageHistoryViewOrderStatistics, peerIds: MessageHistoryViewPeerIds, anchor inputAnchor: HistoryViewInputAnchor, combinedReadStates: MessageHistoryViewReadState?, transientReadStates: MessageHistoryViewReadState?, tag: MessageTags?, count: Int, topTaggedMessages: [MessageId.Namespace: MessageHistoryTopTaggedMessage?], additionalDatas: [AdditionalMessageHistoryViewDataEntry], getMessageCountInRange: (MessageIndex, MessageIndex) -> Int32) { self.anchor = inputAnchor @@ -372,7 +361,7 @@ final class MutableMessageHistoryView { } } - func replay(postbox: Postbox, transaction: PostboxTransaction, updatedMedia: [MediaId: Media?], updatedCachedPeerData: [PeerId: CachedPeerData], context: MutableMessageHistoryViewReplayContext, renderIntermediateMessage: (IntermediateMessage) -> Message) -> Bool { + func replay(postbox: Postbox, transaction: PostboxTransaction) -> Bool { var operations: [[MessageHistoryOperation]] = [] var peerIdsSet = Set() @@ -501,8 +490,8 @@ final class MutableMessageHistoryView { } } } - if !updatedMedia.isEmpty { - if loadedState.updateMedia(updatedMedia: updatedMedia) { + if !transaction.updatedMedia.isEmpty { + if loadedState.updateMedia(updatedMedia: transaction.updatedMedia) { hasChanges = true } } @@ -584,7 +573,7 @@ final class MutableMessageHistoryView { switch self.additionalDatas[i] { case let .cachedPeerData(peerId, currentData): currentCachedPeerData = currentData - if let updatedData = updatedCachedPeerData[peerId] { + if let updatedData = transaction.currentUpdatedCachedPeerData[peerId] { if currentData?.messageIds != updatedData.messageIds { updatedCachedPeerDataMessages = true } @@ -700,21 +689,16 @@ final class MutableMessageHistoryView { } } - return hasChanges - } - - func updatePeers(_ peers: [PeerId: Peer]) -> Bool { - return false - } - - func render(postbox: Postbox) { - - for namespace in self.topTaggedMessages.keys { - if let entry = self.topTaggedMessages[namespace]!, case let .intermediate(message) = entry { - let item: MessageHistoryTopTaggedMessage? = .message(postbox.messageHistoryTable.renderMessage(message, peerTable: postbox.peerTable)) - self.topTaggedMessages[namespace] = item + if hasChanges { + for namespace in self.topTaggedMessages.keys { + if let entry = self.topTaggedMessages[namespace]!, case let .intermediate(message) = entry { + let item: MessageHistoryTopTaggedMessage? = .message(postbox.messageHistoryTable.renderMessage(message, peerTable: postbox.peerTable)) + self.topTaggedMessages[namespace] = item + } } } + + return hasChanges } func firstHole() -> (MessageHistoryViewHole, MessageHistoryViewRelativeHoleDirection)? { @@ -723,8 +707,8 @@ final class MutableMessageHistoryView { switch loadingSample { case .ready: return nil - case let .loadHole(peerId, namespace, _, indices, id): - return (MessageHistoryViewHole.peer(MessageHistoryViewPeerHole(peerId: peerId, namespace: namespace, indices: indices)), .aroundId(MessageId(peerId: peerId, namespace: namespace, id: id))) + case let .loadHole(peerId, namespace, _, id): + return (.peer(MessageHistoryViewPeerHole(peerId: peerId, namespace: namespace)), .aroundId(MessageId(peerId: peerId, namespace: namespace, id: id))) } case let .loaded(loadedSample): if let hole = loadedSample.hole { @@ -734,7 +718,7 @@ final class MutableMessageHistoryView { } else { direction = .aroundId(MessageId(peerId: hole.peerId, namespace: hole.namespace, id: hole.startId)) } - return (MessageHistoryViewHole.peer(MessageHistoryViewPeerHole(peerId: hole.peerId, namespace: hole.namespace, indices: hole.indices)), direction) + return (.peer(MessageHistoryViewPeerHole(peerId: hole.peerId, namespace: hole.namespace)), direction) } else { return nil } diff --git a/Postbox/MessageHistoryViewState.swift b/Postbox/MessageHistoryViewState.swift index 3b1d5ec4af..928fa91ff3 100644 --- a/Postbox/MessageHistoryViewState.swift +++ b/Postbox/MessageHistoryViewState.swift @@ -88,6 +88,22 @@ func binaryIndexOrLower(_ inputArr: [MessageHistoryEntry], _ searchItem: History return hi } +func binaryIndexOrLower(_ inputArr: [MessageHistoryMessageEntry], _ searchItem: HistoryViewAnchor) -> Int { + var lo = 0 + var hi = inputArr.count - 1 + while lo <= hi { + let mid = (lo + hi) / 2 + if searchItem.isGreater(than: inputArr[mid].message.index) { + lo = mid + 1 + } else if searchItem.isLower(than: inputArr[mid].message.index) { + hi = mid - 1 + } else { + return mid + } + } + return hi +} + private func binaryIndexOrLower(_ inputArr: [MutableMessageHistoryEntry], _ searchItem: HistoryViewAnchor) -> Int { var lo = 0 var hi = inputArr.count - 1 @@ -215,7 +231,7 @@ private func isIndex(index: MessageIndex, closerTo anchor: HistoryViewAnchor, th private func sampleHoleRanges(orderedEntriesBySpace: [PeerIdAndNamespace: OrderedHistoryViewEntries], holes: HistoryViewHoles, anchor: HistoryViewAnchor, tag: MessageTags?) -> (clipRanges: [ClosedRange], sampledHole: SampledHistoryViewHole?) { var clipRanges: [ClosedRange] = [] - var sampledHole: (itemIndex: Int, hole: SampledHistoryViewHole)? + var sampledHole: (itemIndex: Int?, hole: SampledHistoryViewHole)? for (space, indices) in holes.holesBySpace { if indices.isEmpty { @@ -242,7 +258,12 @@ private func sampleHoleRanges(orderedEntriesBySpace: [PeerIdAndNamespace: Ordere case .upperBound, .index: holeBounds = (Int32.max - 1, 1) } - return ([MessageIndex.absoluteLowerBound() ... MessageIndex.absoluteUpperBound()], SampledHistoryViewHole(peerId: space.peerId, namespace: space.namespace, tag: tag, indices: indices, startId: holeBounds.startId, endId: holeBounds.endId)) + if case let .index(index) = anchor, index.id.peerId == space.peerId { + return ([MessageIndex.absoluteLowerBound() ... MessageIndex.absoluteUpperBound()], SampledHistoryViewHole(peerId: space.peerId, namespace: space.namespace, tag: tag, indices: indices, startId: holeBounds.startId, endId: holeBounds.endId)) + } else { + sampledHole = (nil, SampledHistoryViewHole(peerId: space.peerId, namespace: space.namespace, tag: tag, indices: indices, startId: holeBounds.startId, endId: holeBounds.endId)) + continue + } } guard let bounds = items.bounds else { assertionFailure("A non-empty entry list should have non-nil bounds") @@ -285,7 +306,7 @@ private func sampleHoleRanges(orderedEntriesBySpace: [PeerIdAndNamespace: Ordere clipRanges.append(MessageIndex.absoluteLowerBound() ... itemClipIndex) var replaceHole = false if let (currentItemIndex, _) = sampledHole { - if abs(lowerDirectionIndex - anchorIndex) < abs(currentItemIndex - anchorIndex) { + if let currentItemIndex = currentItemIndex, abs(lowerDirectionIndex - anchorIndex) < abs(currentItemIndex - anchorIndex) { replaceHole = true } } else { @@ -327,7 +348,7 @@ private func sampleHoleRanges(orderedEntriesBySpace: [PeerIdAndNamespace: Ordere clipRanges.append(itemClipIndex ... MessageIndex.absoluteUpperBound()) var replaceHole = false if let (currentItemIndex, _) = sampledHole { - if abs(higherDirectionIndex - anchorIndex) < abs(currentItemIndex - anchorIndex) { + if let currentItemIndex = currentItemIndex, abs(higherDirectionIndex - anchorIndex) < abs(currentItemIndex - anchorIndex) { replaceHole = true } } else { @@ -800,7 +821,7 @@ private func fetchHoles(postbox: Postbox, locations: MessageHistoryViewPeerIds, enum HistoryViewLoadingSample { case ready(HistoryViewAnchor, HistoryViewHoles) - case loadHole(PeerId, MessageId.Namespace, MessageTags?, IndexSet, MessageId.Id) + case loadHole(PeerId, MessageId.Namespace, MessageTags?, MessageId.Id) } final class HistoryViewLoadingState { @@ -828,7 +849,7 @@ final class HistoryViewLoadingState { while true { if let indices = self.holes.holesBySpace[PeerIdAndNamespace(peerId: self.messageId.peerId, namespace: self.messageId.namespace)] { if indices.contains(Int(messageId.id)) { - return .loadHole(messageId.peerId, messageId.namespace, self.tag, indices, messageId.id) + return .loadHole(messageId.peerId, messageId.namespace, self.tag, messageId.id) } } diff --git a/Postbox/MessageOfInterestHolesView.swift b/Postbox/MessageOfInterestHolesView.swift index e97b3f4ba5..96882aea30 100644 --- a/Postbox/MessageOfInterestHolesView.swift +++ b/Postbox/MessageOfInterestHolesView.swift @@ -22,32 +22,108 @@ public struct MessageOfInterestHole: Hashable, Equatable { public enum MessageOfInterestViewLocation: Hashable { case peer(PeerId) - - public static func ==(lhs: MessageOfInterestViewLocation, rhs: MessageOfInterestViewLocation) -> Bool { - switch lhs { - case let .peer(value): - if case .peer(value) = rhs { - return true - } else { - return false - } - } - } - - public var hashValue: Int { - switch self { - case let .peer(id): - return id.hashValue - } - } } final class MutableMessageOfInterestHolesView: MutablePostboxView { + private let location: MessageOfInterestViewLocation + private let count: Int + private var anchor: HistoryViewInputAnchor + private var wrappedView: MutableMessageHistoryView + + fileprivate var closestHole: MessageOfInterestHole? + fileprivate var closestLaterMedia: [HolesViewMedia] = [] + init(postbox: Postbox, location: MessageOfInterestViewLocation, namespace: MessageId.Namespace, count: Int) { + self.location = location + self.count = count + + var peerId: PeerId + switch self.location { + case let .peer(id): + peerId = id + } + var anchor: HistoryViewInputAnchor = .upperBound + if let combinedState = postbox.readStateTable.getCombinedState(peerId), let state = combinedState.states.first, state.1.count != 0 { + switch state.1 { + case let .idBased(maxIncomingReadId, _, _, _, _): + anchor = .message(MessageId(peerId: peerId, namespace: state.0, id: maxIncomingReadId)) + case let .indexBased(maxIncomingReadIndex, _, _, _): + anchor = .index(maxIncomingReadIndex) + } + } + self.anchor = anchor + self.wrappedView = MutableMessageHistoryView(postbox: postbox, orderStatistics: [], peerIds: .single(peerId), anchor: self.anchor, combinedReadStates: nil, transientReadStates: nil, tag: nil, count: self.count, topTaggedMessages: [:], additionalDatas: [], getMessageCountInRange: { _, _ in return 0}) + let _ = self.updateFromView() + } + + private func updateFromView() -> Bool { + let closestHole: MessageOfInterestHole? + if let (hole, direction) = self.wrappedView.firstHole() { + closestHole = MessageOfInterestHole(hole: hole, direction: direction) + } else { + closestHole = nil + } + + var closestLaterMedia: [HolesViewMedia] = [] + switch self.wrappedView.sampledState { + case .loading: + break + case let .loaded(sample): + switch sample.anchor { + case let .index(index): + let anchorIndex = binaryIndexOrLower(sample.entries, sample.anchor) + loop: for i in max(0, anchorIndex) ..< sample.entries.count { + let message = sample.entries[i].message + if !message.media.isEmpty, let peer = message.peers[message.id.peerId] { + for media in message.media { + closestLaterMedia.append(HolesViewMedia(media: media, peer: peer, authorIsContact: sample.entries[i].attributes.authorIsContact, index: message.index)) + } + } + if closestLaterMedia.count >= 3 { + break loop + } + } + case .lowerBound, .upperBound: + break + } + } + + if self.closestHole != closestHole || self.closestLaterMedia != closestLaterMedia { + self.closestHole = closestHole + self.closestLaterMedia = closestLaterMedia + return true + } else { + return false + } } func replay(postbox: Postbox, transaction: PostboxTransaction) -> Bool { - return false + var peerId: PeerId + switch self.location { + case let .peer(id): + peerId = id + } + var anchor: HistoryViewInputAnchor = self.anchor + if transaction.alteredInitialPeerCombinedReadStates[peerId] != nil { + if let combinedState = postbox.readStateTable.getCombinedState(peerId), let state = combinedState.states.first, state.1.count != 0 { + switch state.1 { + case let .idBased(maxIncomingReadId, _, _, _, _): + anchor = .message(MessageId(peerId: peerId, namespace: state.0, id: maxIncomingReadId)) + case let .indexBased(maxIncomingReadIndex, _, _, _): + anchor = .index(maxIncomingReadIndex) + } + } + } + + if self.anchor != anchor { + self.anchor = anchor + self.wrappedView = MutableMessageHistoryView(postbox: postbox, orderStatistics: [], peerIds: .single(peerId), anchor: self.anchor, combinedReadStates: nil, transientReadStates: nil, tag: nil, count: self.count, topTaggedMessages: [:], additionalDatas: [], getMessageCountInRange: { _, _ in return 0}) + return self.updateFromView() + } else if self.wrappedView.replay(postbox: postbox, transaction: transaction) { + return self.updateFromView() + } else { + return false + } } func immutableView() -> PostboxView { @@ -60,7 +136,7 @@ public final class MessageOfInterestHolesView: PostboxView { public let closestLaterMedia: [HolesViewMedia] init(_ view: MutableMessageOfInterestHolesView) { - self.closestHole = nil - self.closestLaterMedia = [] + self.closestHole = view.closestHole + self.closestLaterMedia = view.closestLaterMedia } } diff --git a/Postbox/Postbox.swift b/Postbox/Postbox.swift index 1135a36592..a2e1ce83f0 100644 --- a/Postbox/Postbox.swift +++ b/Postbox/Postbox.swift @@ -695,19 +695,19 @@ public final class Transaction { self.postbox?.setPreferencesEntry(key: key, value: f(self.postbox?.getPreferencesEntry(key: key))) } - public func getPinnedItemIds() -> [PinnedItemId] { + public func getPinnedItemIds(groupId: PeerGroupId?) -> [PinnedItemId] { assert(!self.disposed) if let postbox = self.postbox { - return postbox.chatListTable.getPinnedItemIds(messageHistoryTable: postbox.messageHistoryTable, peerChatInterfaceStateTable: postbox.peerChatInterfaceStateTable) + return postbox.chatListTable.getPinnedItemIds(groupId: groupId, messageHistoryTable: postbox.messageHistoryTable, peerChatInterfaceStateTable: postbox.peerChatInterfaceStateTable) } else { return [] } } - public func setPinnedItemIds(_ itemIds: [PinnedItemId]) { + public func setPinnedItemIds(groupId: PeerGroupId?, itemIds: [PinnedItemId]) { assert(!self.disposed) if let postbox = self.postbox { - postbox.setPinnedItemIds(itemIds) + postbox.setPinnedItemIds(groupId: groupId, itemIds: itemIds) } } @@ -928,7 +928,7 @@ public func openPostbox(basePath: String, seedConfiguration: SeedConfiguration, #if DEBUG //debugSaveState(basePath: basePath, name: "previous1") - //debugRestoreState(basePath: basePath, name: "previous1") + debugRestoreState(basePath: basePath, name: "previous1") #endif let startTime = CFAbsoluteTimeGetCurrent() @@ -1805,20 +1805,18 @@ public final class Postbox { let previousGroupId = self.groupAssociationTable.get(peerId: id) if previousGroupId != groupId { self.groupAssociationTable.set(peerId: id, groupId: groupId, initialPeerGroupIdsBeforeUpdate: &self.currentInitialPeerGroupIdsBeforeUpdate) - if let _ = groupId { - if let index = self.chatListTable.getPeerChatListIndex(peerId: id), index.1.pinningIndex != nil { - var itemIds = self.chatListTable.getPinnedItemIds(messageHistoryTable: self.messageHistoryTable, peerChatInterfaceStateTable: self.peerChatInterfaceStateTable) - if let index = itemIds.index(of: .peer(id)) { - itemIds.remove(at: index) - self.chatListTable.setPinnedItemIds(itemIds, updatedChatListInclusions: &self.currentUpdatedChatListInclusions, updatedChatListGroupInclusions: &self.currentUpdatedChatListGroupInclusions, messageHistoryTable: self.messageHistoryTable, peerChatInterfaceStateTable: self.peerChatInterfaceStateTable) - } + if let index = self.chatListTable.getPeerChatListIndex(peerId: id), index.1.pinningIndex != nil { + var itemIds = self.chatListTable.getPinnedItemIds(groupId: previousGroupId, messageHistoryTable: self.messageHistoryTable, peerChatInterfaceStateTable: self.peerChatInterfaceStateTable) + if let index = itemIds.index(of: .peer(id)) { + itemIds.remove(at: index) + self.chatListTable.setPinnedItemIds(groupId: previousGroupId, itemIds: itemIds, updatedChatListInclusions: &self.currentUpdatedChatListInclusions, updatedChatListGroupInclusions: &self.currentUpdatedChatListGroupInclusions, messageHistoryTable: self.messageHistoryTable, peerChatInterfaceStateTable: self.peerChatInterfaceStateTable) } } } } - fileprivate func setPinnedItemIds(_ itemIds: [PinnedItemId]) { - self.chatListTable.setPinnedItemIds(itemIds, updatedChatListInclusions: &self.currentUpdatedChatListInclusions, updatedChatListGroupInclusions: &self.currentUpdatedChatListGroupInclusions, messageHistoryTable: self.messageHistoryTable, peerChatInterfaceStateTable: self.peerChatInterfaceStateTable) + fileprivate func setPinnedItemIds(groupId: PeerGroupId?, itemIds: [PinnedItemId]) { + self.chatListTable.setPinnedItemIds(groupId: groupId, itemIds: itemIds, updatedChatListInclusions: &self.currentUpdatedChatListInclusions, updatedChatListGroupInclusions: &self.currentUpdatedChatListGroupInclusions, messageHistoryTable: self.messageHistoryTable, peerChatInterfaceStateTable: self.peerChatInterfaceStateTable) } fileprivate func updateCurrentPeerNotificationSettings(_ notificationSettings: [PeerId: PeerNotificationSettings]) { @@ -2348,7 +2346,6 @@ public final class Postbox { return 0 } }) - mutableView.render(postbox: self) let initialUpdateType: ViewUpdateType = .Initial diff --git a/Postbox/ViewTracker.swift b/Postbox/ViewTracker.swift index 83e427e9b0..81d925b351 100644 --- a/Postbox/ViewTracker.swift +++ b/Postbox/ViewTracker.swift @@ -245,7 +245,6 @@ final class ViewTracker { for (mutableView, pipe) in self.messageHistoryViews.copyItems() { if mutableView.refreshDueToExternalTransaction(postbox: postbox) { - mutableView.render(postbox: postbox) pipe.putNext((MessageHistoryView(mutableView), .Generic)) updateTrackedHoles = true @@ -292,12 +291,11 @@ final class ViewTracker { } for (mutableView, pipe) in self.messageHistoryViews.copyItems() { - let context = MutableMessageHistoryViewReplayContext() var updated = false let previousPeerIds = mutableView.peerIds - if mutableView.replay(postbox: postbox, transaction: transaction, updatedMedia: transaction.updatedMedia, updatedCachedPeerData: transaction.currentUpdatedCachedPeerData, context: context, renderIntermediateMessage: self.renderMessage) { + if mutableView.replay(postbox: postbox, transaction: transaction) { updated = true } @@ -331,10 +329,6 @@ final class ViewTracker { } } } - - if mutableView.updatePeers(transaction.currentUpdatedPeers) { - updated = true - } mutableView.updatePeerIds(transaction: transaction) if mutableView.peerIds != previousPeerIds { @@ -346,8 +340,6 @@ final class ViewTracker { if updated { updateTrackedHoles = true - mutableView.render(postbox: postbox) - pipe.putNext((MessageHistoryView(mutableView), updateType)) } }