FetchManager: fix userInitiated item persistence

ChatList: fix animation glitches, limit chat selection to 100
This commit is contained in:
Peter 2019-05-01 21:33:22 +04:00
parent e486a4e00e
commit b43a19fa3b
5 changed files with 26 additions and 15 deletions

View File

@ -475,6 +475,8 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode {
}
additionalData.append(.totalUnreadState)
let currentViewVersion = Atomic<Int?>(value: nil)
let historyViewUpdate = self.chatHistoryLocationPromise.get()
|> distinctUntilChanged
|> mapToSignal { location in
@ -488,6 +490,16 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode {
}
}
}
|> map { view -> (ChatHistoryViewUpdate, Int) in
let version = currentViewVersion.modify({ value in
if let value = value {
return value + 1
} else {
return 0
}
})!
return (view, version)
}
let previousView = Atomic<ChatHistoryView?>(value: nil)
let automaticDownloadNetworkType = context.account.networkType
@ -503,7 +515,7 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode {
let previousHistoryAppearsCleared = Atomic<Bool?>(value: nil)
let historyViewTransition = combineLatest(historyViewUpdate, self.chatPresentationDataPromise.get(), selectedMessages, automaticDownloadNetworkType, self.historyAppearsClearedPromise.get())
let historyViewTransition = combineLatest(queue: messageViewQueue, historyViewUpdate, self.chatPresentationDataPromise.get(), selectedMessages, automaticDownloadNetworkType, self.historyAppearsClearedPromise.get())
|> introduceError(Void.self)
|> mapToQueue { [weak self] update, chatPresentationData, selectedMessages, networkType, historyAppearsCleared -> Signal<ChatHistoryListViewTransition, Void> in
func applyHole() {
@ -527,7 +539,7 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode {
}
let initialData: ChatHistoryCombinedInitialData?
switch update {
switch update.0 {
case let .Loading(combinedInitialData, type):
if case .Generic(.FillHole) = type {
applyHole()
@ -633,7 +645,7 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode {
|> deliverOnMainQueue
|> mapToQueue { [weak self] transition -> Signal<Void, Void> in
if let strongSelf = self {
return strongSelf.enqueueHistoryViewTransition(transition)
return strongSelf.enqueueHistoryViewTransition(transition)
|> introduceError(Void.self)
}
return .complete()

View File

@ -1448,7 +1448,6 @@ class ChatListItemNode: ItemListRevealOptionsItemNode {
case .peer:
let itemId: PinnedItemId = .peer(item.index.messageIndex.id.peerId)
item.interaction.setItemPinned(itemId, true)
close = false
case .groupReference:
break
}
@ -1457,7 +1456,6 @@ class ChatListItemNode: ItemListRevealOptionsItemNode {
case .peer:
let itemId: PinnedItemId = .peer(item.index.messageIndex.id.peerId)
item.interaction.setItemPinned(itemId, false)
close = false
case .groupReference:
break
}

View File

@ -407,7 +407,9 @@ final class ChatListNode: ListView {
if state.selectedPeerIds.contains(peerId) {
state.selectedPeerIds.remove(peerId)
} else {
state.selectedPeerIds.insert(peerId)
if state.selectedPeerIds.count < 100 {
state.selectedPeerIds.insert(peerId)
}
}
return state
}
@ -442,11 +444,6 @@ final class ChatListNode: ListView {
case let .limitExceeded(maxCount):
strongSelf.presentAlert?(strongSelf.currentState.presentationData.strings.DialogList_PinLimitError("\(maxCount)").0)
}
strongSelf.updateState { state in
var state = state
state.peerIdWithRevealedOptions = nil
return state
}
}
})
}, setPeerMuted: { [weak self] peerId, _ in
@ -533,7 +530,7 @@ final class ChatListNode: ListView {
let currentPeerId: PeerId = context.account.peerId
let chatListNodeViewTransition = combineLatest(hideArchivedFolderByDefault, displayArchiveIntro, savedMessagesPeer, chatListViewUpdate, self.statePromise.get())
let chatListNodeViewTransition = combineLatest(queue: viewProcessingQueue, hideArchivedFolderByDefault, displayArchiveIntro, savedMessagesPeer, chatListViewUpdate, self.statePromise.get())
|> mapToQueue { (hideArchivedFolderByDefault, displayArchiveIntro, savedMessagesPeer, update, state) -> Signal<ChatListNodeListViewTransition, NoError> in
let previousHideArchivedFolderByDefaultValue = previousHideArchivedFolderByDefault.swap(hideArchivedFolderByDefault)

View File

@ -102,8 +102,12 @@ private final class FetchManagerLocationEntry {
var combinedRanges: IndexSet {
var result = IndexSet()
for range in self.ranges.copyItems() {
result.formUnion(range)
if self.userInitiated {
result.insert(integersIn: 0 ..< Int(Int32.max))
} else {
for range in self.ranges.copyItems() {
result.formUnion(range)
}
}
return result
}

View File

@ -49,7 +49,7 @@ func messageFileMediaResourceStatus(context: AccountContext, file: TelegramMedia
return status?.status
}
if message.flags.isSending {
if message.flags.isSending {
return combineLatest(messageMediaFileStatus(context: context, messageId: message.id, file: file), context.account.pendingMessageManager.pendingMessageStatus(message.id), playbackStatus)
|> map { resourceStatus, pendingStatus, playbackStatus -> FileMediaResourceStatus in
let mediaStatus: FileMediaResourceMediaStatus