Fix more warnings

This commit is contained in:
Ali 2021-08-05 12:58:22 +02:00
parent 0a9be38425
commit 895927cc04
40 changed files with 83 additions and 439 deletions

View File

@ -4239,7 +4239,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
return message return message
} }
|> distinctUntilChanged |> distinctUntilChanged
case let .replyThread(replyThreadMessage): case .replyThread:
return .single(nil) return .single(nil)
} }
return topPinnedMessage return topPinnedMessage
@ -7078,7 +7078,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
return return
} }
if let navigationController = strongSelf.effectiveNavigationController { if let navigationController = strongSelf.effectiveNavigationController {
ApplicationSpecificNotice.incrementNextChatSuggestionTip(accountManager: strongSelf.context.sharedContext.accountManager).start() let _ = ApplicationSpecificNotice.incrementNextChatSuggestionTip(accountManager: strongSelf.context.sharedContext.accountManager).start()
let snapshotState = strongSelf.chatDisplayNode.prepareSnapshotState( let snapshotState = strongSelf.chatDisplayNode.prepareSnapshotState(
titleViewSnapshotState: strongSelf.chatTitleView?.prepareSnapshotState(), titleViewSnapshotState: strongSelf.chatTitleView?.prepareSnapshotState(),
@ -7219,7 +7219,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
} }
} }
self.tempVoicePlaylistItemChanged = { [weak self] previousItem, currentItem in self.tempVoicePlaylistItemChanged = { [weak self] previousItem, currentItem in
guard let strongSelf = self, case let .peer(peerId) = strongSelf.chatLocation else { guard let strongSelf = self, case .peer = strongSelf.chatLocation else {
return return
} }
@ -10481,7 +10481,6 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
guard let strongSelf = self else { guard let strongSelf = self else {
return return
} }
let complete = results.completed
strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: true, { current in strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: true, { current in
if let data = current.search, let previousResultsState = data.resultsState { if let data = current.search, let previousResultsState = data.resultsState {
let messageIndices = results.messages.map({ $0.index }).sorted() let messageIndices = results.messages.map({ $0.index }).sorted()
@ -11398,7 +11397,6 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
cancelImpl = { [weak self] in cancelImpl = { [weak self] in
self?.resolvePeerByNameDisposable?.set(nil) self?.resolvePeerByNameDisposable?.set(nil)
} }
let account = self.context.account
disposable.set((resolveSignal disposable.set((resolveSignal
|> take(1) |> take(1)
|> mapToSignal { peer -> Signal<Peer?, NoError> in |> mapToSignal { peer -> Signal<Peer?, NoError> in
@ -11427,7 +11425,6 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
if self.resolvePeerByNameDisposable == nil { if self.resolvePeerByNameDisposable == nil {
self.resolvePeerByNameDisposable = MetaDisposable() self.resolvePeerByNameDisposable = MetaDisposable()
} }
let account = self.context.account
var resolveSignal: Signal<Peer?, NoError> var resolveSignal: Signal<Peer?, NoError>
if let peerName = peerName { if let peerName = peerName {
resolveSignal = self.context.engine.peers.resolvePeerByName(name: peerName) resolveSignal = self.context.engine.peers.resolvePeerByName(name: peerName)

View File

@ -820,9 +820,6 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate {
insets = layout.insets(options: [.input]) insets = layout.insets(options: [.input])
} }
let statusBarHeight = layout.insets(options: [.statusBar]).top
if case .overlay = self.chatPresentationInterfaceState.mode { if case .overlay = self.chatPresentationInterfaceState.mode {
insets.top = 44.0 insets.top = 44.0
} else { } else {
@ -1152,7 +1149,7 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate {
} }
var displayTopDimNode = false var displayTopDimNode = false
var ensureTopInsetForOverlayHighlightedItems: CGFloat? let ensureTopInsetForOverlayHighlightedItems: CGFloat? = nil
var expandTopDimNode = false var expandTopDimNode = false
if case let .media(_, expanded) = self.chatPresentationInterfaceState.inputMode, expanded != nil { if case let .media(_, expanded) = self.chatPresentationInterfaceState.inputMode, expanded != nil {
displayTopDimNode = true displayTopDimNode = true
@ -1168,7 +1165,6 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate {
topInset -= UIScreenPixel topInset -= UIScreenPixel
} }
} }
let topFrame = CGRect(origin: CGPoint(x: 0.0, y: 0.0), size: CGSize(width: layout.size.width, height: max(0.0, topInset)))
let inputPanelOrigin = layout.size.height - insets.bottom - bottomOverflowOffset - inputPanelsHeight let inputPanelOrigin = layout.size.height - insets.bottom - bottomOverflowOffset - inputPanelsHeight
@ -1286,11 +1282,6 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate {
let inputContextPanelsFrame = CGRect(origin: CGPoint(x: 0.0, y: insets.top), size: CGSize(width: layout.size.width, height: max(0.0, layout.size.height - insets.bottom - inputPanelsHeight - insets.top))) let inputContextPanelsFrame = CGRect(origin: CGPoint(x: 0.0, y: insets.top), size: CGSize(width: layout.size.width, height: max(0.0, layout.size.height - insets.bottom - inputPanelsHeight - insets.top)))
let inputContextPanelsOverMainPanelFrame = CGRect(origin: CGPoint(x: 0.0, y: insets.top), size: CGSize(width: layout.size.width, height: max(0.0, layout.size.height - insets.bottom - (inputPanelSize == nil ? CGFloat(0.0) : inputPanelSize!.height) - insets.top))) let inputContextPanelsOverMainPanelFrame = CGRect(origin: CGPoint(x: 0.0, y: insets.top), size: CGSize(width: layout.size.width, height: max(0.0, layout.size.height - insets.bottom - (inputPanelSize == nil ? CGFloat(0.0) : inputPanelSize!.height) - insets.top)))
if transition.isAnimated, let derivedLayoutState = self.derivedLayoutState {
let offset = derivedLayoutState.inputContextPanelsOverMainPanelFrame.maxY - inputContextPanelsOverMainPanelFrame.maxY
//transition.animateOffsetAdditive(node: self.inputContextPanelContainer, offset: -offset)
}
if let inputContextPanelNode = self.inputContextPanelNode { if let inputContextPanelNode = self.inputContextPanelNode {
let panelFrame = inputContextPanelNode.placement == .overTextInput ? inputContextPanelsOverMainPanelFrame : inputContextPanelsFrame let panelFrame = inputContextPanelNode.placement == .overTextInput ? inputContextPanelsOverMainPanelFrame : inputContextPanelsFrame
if immediatelyLayoutInputContextPanelAndAnimateAppearance { if immediatelyLayoutInputContextPanelAndAnimateAppearance {

View File

@ -1094,7 +1094,6 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode {
let previousTheme = strongSelf.currentPresentationData.theme let previousTheme = strongSelf.currentPresentationData.theme
let previousStrings = strongSelf.currentPresentationData.strings let previousStrings = strongSelf.currentPresentationData.strings
let previousWallpaper = strongSelf.currentPresentationData.theme.wallpaper let previousWallpaper = strongSelf.currentPresentationData.theme.wallpaper
let previousDisableAnimations = strongSelf.currentPresentationData.disableAnimations
let previousAnimatedEmojiScale = strongSelf.currentPresentationData.animatedEmojiScale let previousAnimatedEmojiScale = strongSelf.currentPresentationData.animatedEmojiScale
let animatedEmojiConfig = ChatHistoryAnimatedEmojiConfiguration.with(appConfiguration: appConfiguration) let animatedEmojiConfig = ChatHistoryAnimatedEmojiConfiguration.with(appConfiguration: appConfiguration)
@ -1311,8 +1310,6 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode {
var messageIdsWithUnsupportedMedia: [MessageId] = [] var messageIdsWithUnsupportedMedia: [MessageId] = []
var messageIdsWithRefreshMedia: [MessageId] = [] var messageIdsWithRefreshMedia: [MessageId] = []
var messageIdsWithUnseenPersonalMention: [MessageId] = [] var messageIdsWithUnseenPersonalMention: [MessageId] = []
var messagesWithPreloadableMediaToEarlier: [(Message, Media)] = []
var messagesWithPreloadableMediaToLater: [(Message, Media)] = []
if indexRange.0 <= indexRange.1 { if indexRange.0 <= indexRange.1 {
for i in (indexRange.0 ... indexRange.1) { for i in (indexRange.0 ... indexRange.1) {
@ -1593,7 +1590,7 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode {
} else if case let .MessageGroupEntry(_, messages, _) = entry { } else if case let .MessageGroupEntry(_, messages, _) = entry {
currentMessage = messages.first?.0 currentMessage = messages.first?.0
} }
if let message = currentMessage, let anchorMessage = self.anchorMessageInCurrentHistoryView() { if let message = currentMessage, let _ = self.anchorMessageInCurrentHistoryView() {
self.chatHistoryLocationValue = ChatHistoryLocationInput(content: .Scroll(index: .message(message.index), anchorIndex: .message(message.index), sourceIndex: .upperBound, scrollPosition: .bottom(0.0), animated: true, highlight: false), id: self.takeNextHistoryLocationId()) self.chatHistoryLocationValue = ChatHistoryLocationInput(content: .Scroll(index: .message(message.index), anchorIndex: .message(message.index), sourceIndex: .upperBound, scrollPosition: .bottom(0.0), animated: true, highlight: false), id: self.takeNextHistoryLocationId())
} }
} }

View File

@ -22,7 +22,7 @@ public enum ChatHistoryNodeLoadState: Equatable {
case messages case messages
} }
public protocol ChatHistoryNode: class { public protocol ChatHistoryNode: AnyObject {
var historyState: ValuePromise<ChatHistoryNodeHistoryState> { get } var historyState: ValuePromise<ChatHistoryNodeHistoryState> { get }
var preloadPages: Bool { get set } var preloadPages: Bool { get set }

View File

@ -14,27 +14,8 @@ import ListMessageItem
private enum ChatHistorySearchEntryStableId: Hashable { private enum ChatHistorySearchEntryStableId: Hashable {
case messageId(MessageId) case messageId(MessageId)
static func ==(lhs: ChatHistorySearchEntryStableId, rhs: ChatHistorySearchEntryStableId) -> Bool {
switch lhs {
case let .messageId(messageId):
if case .messageId(messageId) = rhs {
return true
} else {
return false
}
}
}
var hashValue: Int {
switch self {
case let .messageId(messageId):
return messageId.hashValue
}
}
} }
private enum ChatHistorySearchEntry: Comparable, Identifiable { private enum ChatHistorySearchEntry: Comparable, Identifiable {
case message(Message, PresentationTheme, PresentationStrings, PresentationDateTimeFormat, PresentationFontSize) case message(Message, PresentationTheme, PresentationStrings, PresentationDateTimeFormat, PresentationFontSize)

View File

@ -223,7 +223,7 @@ func chatHistoryViewForLocation(_ location: ChatHistoryLocationInput, context: A
return .HistoryView(view: view, type: reportUpdateType, scrollPosition: .index(index: anchorIndex, position: .center(.bottom), directionHint: .Down, animated: false, highlight: highlight), flashIndicators: false, originalScrollPosition: nil, initialData: ChatHistoryCombinedInitialData(initialData: initialData, buttonKeyboardMessage: view.topTaggedMessages.first, cachedData: cachedData, cachedDataMessages: cachedDataMessages, readStateData: readStateData), id: location.id) return .HistoryView(view: view, type: reportUpdateType, scrollPosition: .index(index: anchorIndex, position: .center(.bottom), directionHint: .Down, animated: false, highlight: highlight), flashIndicators: false, originalScrollPosition: nil, initialData: ChatHistoryCombinedInitialData(initialData: initialData, buttonKeyboardMessage: view.topTaggedMessages.first, cachedData: cachedData, cachedDataMessages: cachedDataMessages, readStateData: readStateData), id: location.id)
} }
} }
case let .Navigation(index, anchorIndex, count, highlight): case let .Navigation(index, anchorIndex, count, _):
var first = true var first = true
return account.viewTracker.aroundMessageHistoryViewForLocation(context.chatLocationInput(for: chatLocation, contextHolder: chatLocationContextHolder), index: index, anchorIndex: anchorIndex, count: count, ignoreRelatedChats: ignoreRelatedChats, fixedCombinedReadStates: fixedCombinedReadStates, tagMask: tagMask, appendMessagesFromTheSameGroup: appendMessagesFromTheSameGroup, orderStatistics: orderStatistics, additionalData: additionalData) |> map { view, updateType, initialData -> ChatHistoryViewUpdate in return account.viewTracker.aroundMessageHistoryViewForLocation(context.chatLocationInput(for: chatLocation, contextHolder: chatLocationContextHolder), index: index, anchorIndex: anchorIndex, count: count, ignoreRelatedChats: ignoreRelatedChats, fixedCombinedReadStates: fixedCombinedReadStates, tagMask: tagMask, appendMessagesFromTheSameGroup: appendMessagesFromTheSameGroup, orderStatistics: orderStatistics, additionalData: additionalData) |> map { view, updateType, initialData -> ChatHistoryViewUpdate in
let (cachedData, cachedDataMessages, readStateData) = extractAdditionalData(view: view, chatLocation: chatLocation) let (cachedData, cachedDataMessages, readStateData) = extractAdditionalData(view: view, chatLocation: chatLocation)

View File

@ -1689,8 +1689,8 @@ final class ChatMediaInputNode: ChatInputNode {
searchContainerNode.frame = containerFrame searchContainerNode.frame = containerFrame
searchContainerNode.updateLayout(size: containerFrame.size, leftInset: leftInset, rightInset: rightInset, bottomInset: bottomInset, inputHeight: inputHeight, deviceMetrics: deviceMetrics, transition: .immediate) searchContainerNode.updateLayout(size: containerFrame.size, leftInset: leftInset, rightInset: rightInset, bottomInset: bottomInset, inputHeight: inputHeight, deviceMetrics: deviceMetrics, transition: .immediate)
var placeholderNode: PaneSearchBarPlaceholderNode? var placeholderNode: PaneSearchBarPlaceholderNode?
var anchorTop = CGPoint(x: 0.0, y: 0.0) let anchorTop = CGPoint(x: 0.0, y: 0.0)
var anchorTopView: UIView = self.view let anchorTopView: UIView = self.view
if let searchMode = searchMode { if let searchMode = searchMode {
switch searchMode { switch searchMode {
case .gif: case .gif:
@ -2025,7 +2025,7 @@ final class ChatMediaInputNode: ChatInputNode {
collectionListPanelOffset = 0.0 collectionListPanelOffset = 0.0
} }
var listPanelOffset = collectionListPanelOffset * 2.0 let listPanelOffset = collectionListPanelOffset * 2.0
self.updateAppearanceTransition(transition: transition) self.updateAppearanceTransition(transition: transition)
transition.updateFrame(node: self.collectionListPanel, frame: CGRect(origin: CGPoint(x: 0.0, y: listPanelOffset), size: self.collectionListPanel.bounds.size)) transition.updateFrame(node: self.collectionListPanel, frame: CGRect(origin: CGPoint(x: 0.0, y: listPanelOffset), size: self.collectionListPanel.bounds.size))

View File

@ -390,7 +390,6 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView, UIGestureRecognizerD
var viaBotApply: (TextNodeLayout, () -> TextNode)? var viaBotApply: (TextNodeLayout, () -> TextNode)?
var replyInfoApply: (CGSize, () -> ChatMessageReplyInfoNode)? var replyInfoApply: (CGSize, () -> ChatMessageReplyInfoNode)?
var updatedReplyBackgroundNode: NavigationBackgroundNode? var updatedReplyBackgroundNode: NavigationBackgroundNode?
var replyBackgroundImage: UIImage?
var replyMarkup: ReplyMarkupMessageAttribute? var replyMarkup: ReplyMarkupMessageAttribute?
let availableWidth = max(60.0, params.width - params.leftInset - params.rightInset - normalDisplaySize.width - 20.0 - layoutConstants.bubble.edgeInset * 2.0 - avatarInset - layoutConstants.bubble.contentInsets.left) let availableWidth = max(60.0, params.width - params.leftInset - params.rightInset - normalDisplaySize.width - 20.0 - layoutConstants.bubble.edgeInset * 2.0 - avatarInset - layoutConstants.bubble.contentInsets.left)
@ -489,7 +488,6 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView, UIGestureRecognizerD
var forwardInfoSizeApply: (CGSize, (CGFloat) -> ChatMessageForwardInfoNode)? var forwardInfoSizeApply: (CGSize, (CGFloat) -> ChatMessageForwardInfoNode)?
var updatedForwardBackgroundNode: NavigationBackgroundNode? var updatedForwardBackgroundNode: NavigationBackgroundNode?
var forwardBackgroundImage: UIImage?
if !ignoreForward, let forwardInfo = item.message.forwardInfo { if !ignoreForward, let forwardInfo = item.message.forwardInfo {
let forwardPsaType = forwardInfo.psaType let forwardPsaType = forwardInfo.psaType

View File

@ -327,24 +327,7 @@ final class ChatPinnedMessageTitlePanelNode: ChatTitleAccessoryPanelNode {
if let animation = animation { if let animation = animation {
animationTransition = .animated(duration: 0.2, curve: .easeInOut) animationTransition = .animated(duration: 0.2, curve: .easeInOut)
if false, let copyView = self.contentContainer.view.snapshotView(afterScreenUpdates: false) { if let copyView = self.textNode.view.snapshotView(afterScreenUpdates: false) {
let offset: CGFloat
switch animation {
case .slideToTop:
offset = -40.0
case .slideToBottom:
offset = 40.0
}
copyView.frame = self.contentContainer.frame
self.clippingContainer.view.addSubview(copyView)
copyView.layer.animatePosition(from: CGPoint(), to: CGPoint(x: 0.0, y: offset), duration: 0.2, removeOnCompletion: false, additive: true)
copyView.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false, completion: { [weak copyView] _ in
copyView?.removeFromSuperview()
})
self.contentContainer.layer.animatePosition(from: CGPoint(x: 0.0, y: -offset), to: CGPoint(), duration: 0.2, additive: true)
self.contentContainer.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2)
} else if let copyView = self.textNode.view.snapshotView(afterScreenUpdates: false) {
let offset: CGFloat let offset: CGFloat
switch animation { switch animation {
case .slideToTop: case .slideToTop:

View File

@ -781,7 +781,6 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode {
} }
private func openPeerMention(_ name: String) { private func openPeerMention(_ name: String) {
let postbox = self.context.account.postbox
self.navigationActionDisposable.set((self.context.engine.peers.resolvePeerByName(name: name, ageLimit: 10) self.navigationActionDisposable.set((self.context.engine.peers.resolvePeerByName(name: name, ageLimit: 10)
|> take(1) |> take(1)
|> deliverOnMainQueue).start(next: { [weak self] peer in |> deliverOnMainQueue).start(next: { [weak self] peer in

View File

@ -36,32 +36,6 @@ private enum ChatRecentActionsFilterSection: Int32 {
private enum ChatRecentActionsFilterEntryStableId: Hashable { private enum ChatRecentActionsFilterEntryStableId: Hashable {
case index(Int32) case index(Int32)
case peer(PeerId) case peer(PeerId)
var hashValue: Int {
switch self {
case let .index(index):
return index.hashValue
case let .peer(peerId):
return peerId.hashValue
}
}
static func ==(lhs: ChatRecentActionsFilterEntryStableId, rhs: ChatRecentActionsFilterEntryStableId) -> Bool {
switch lhs {
case let .index(index):
if case .index(index) = rhs {
return true
} else {
return false
}
case let .peer(peerId):
if case .peer(peerId) = rhs {
return true
} else {
return false
}
}
}
} }
private enum ChatRecentActionsFilterEntry: ItemListNodeEntry { private enum ChatRecentActionsFilterEntry: ItemListNodeEntry {

View File

@ -19,7 +19,6 @@ final class ChatSecretAutoremoveTimerActionSheetController: ActionSheetControlle
init(context: AccountContext, currentValue: Int32, availableValues: [Int32]? = nil, applyValue: @escaping (Int32) -> Void) { init(context: AccountContext, currentValue: Int32, availableValues: [Int32]? = nil, applyValue: @escaping (Int32) -> Void) {
let presentationData = context.sharedContext.currentPresentationData.with { $0 } let presentationData = context.sharedContext.currentPresentationData.with { $0 }
let theme = presentationData.theme
let strings = presentationData.strings let strings = presentationData.strings
super.init(theme: ActionSheetControllerTheme(presentationData: presentationData)) super.init(theme: ActionSheetControllerTheme(presentationData: presentationData))

View File

@ -370,7 +370,6 @@ final class ChatSendMessageActionSheetControllerNode: ViewControllerTracingNode,
let outgoing: PresentationThemeBubbleColorComponents = self.presentationData.chatWallpaper.isEmpty ? self.presentationData.theme.chat.message.outgoing.bubble.withoutWallpaper : self.presentationData.theme.chat.message.outgoing.bubble.withWallpaper let outgoing: PresentationThemeBubbleColorComponents = self.presentationData.chatWallpaper.isEmpty ? self.presentationData.theme.chat.message.outgoing.bubble.withoutWallpaper : self.presentationData.theme.chat.message.outgoing.bubble.withWallpaper
let maxCornerRadius = self.presentationData.chatBubbleCorners.mainRadius let maxCornerRadius = self.presentationData.chatBubbleCorners.mainRadius
let minCornerRadius = self.presentationData.chatBubbleCorners.auxiliaryRadius
self.messageBackgroundNode.image = messageBubbleImage(maxCornerRadius: maxCornerRadius, minCornerRadius: maxCornerRadius, incoming: false, fillColor: outgoing.gradientFill, strokeColor: outgoing.fill == outgoing.gradientFill ? outgoing.stroke : .clear, neighbors: .none, theme: self.presentationData.theme.chat, wallpaper: self.presentationData.chatWallpaper, knockout: false) self.messageBackgroundNode.image = messageBubbleImage(maxCornerRadius: maxCornerRadius, minCornerRadius: maxCornerRadius, incoming: false, fillColor: outgoing.gradientFill, strokeColor: outgoing.fill == outgoing.gradientFill ? outgoing.stroke : .clear, neighbors: .none, theme: self.presentationData.theme.chat, wallpaper: self.presentationData.chatWallpaper, knockout: false)
for node in self.contentNodes { for node in self.contentNodes {

View File

@ -232,32 +232,32 @@ private enum CreateGroupEntry: ItemListNodeEntry {
func item(presentationData: ItemListPresentationData, arguments: Any) -> ListViewItem { func item(presentationData: ItemListPresentationData, arguments: Any) -> ListViewItem {
let arguments = arguments as! CreateGroupArguments let arguments = arguments as! CreateGroupArguments
switch self { switch self {
case let .groupInfo(theme, strings, dateTimeFormat, peer, state, avatar): case let .groupInfo(_, _, dateTimeFormat, peer, state, avatar):
return ItemListAvatarAndNameInfoItem(accountContext: arguments.context, presentationData: presentationData, dateTimeFormat: dateTimeFormat, mode: .editSettings, peer: peer, presence: nil, cachedData: nil, state: state, sectionId: ItemListSectionId(self.section), style: .blocks(withTopInset: false, withExtendedBottomInset: false), editingNameUpdated: { editingName in return ItemListAvatarAndNameInfoItem(accountContext: arguments.context, presentationData: presentationData, dateTimeFormat: dateTimeFormat, mode: .editSettings, peer: peer, presence: nil, cachedData: nil, state: state, sectionId: ItemListSectionId(self.section), style: .blocks(withTopInset: false, withExtendedBottomInset: false), editingNameUpdated: { editingName in
arguments.updateEditingName(editingName) arguments.updateEditingName(editingName)
}, avatarTapped: { }, avatarTapped: {
arguments.changeProfilePhoto() arguments.changeProfilePhoto()
}, updatingImage: avatar, tag: CreateGroupEntryTag.info) }, updatingImage: avatar, tag: CreateGroupEntryTag.info)
case let .setProfilePhoto(theme, text): case let .setProfilePhoto(_, text):
return ItemListActionItem(presentationData: presentationData, title: text, kind: .generic, alignment: .natural, sectionId: ItemListSectionId(self.section), style: .blocks, action: { return ItemListActionItem(presentationData: presentationData, title: text, kind: .generic, alignment: .natural, sectionId: ItemListSectionId(self.section), style: .blocks, action: {
arguments.changeProfilePhoto() arguments.changeProfilePhoto()
}) })
case let .member(_, theme, strings, dateTimeFormat, nameDisplayOrder, peer, presence): case let .member(_, _, _, dateTimeFormat, nameDisplayOrder, peer, presence):
return ItemListPeerItem(presentationData: presentationData, dateTimeFormat: dateTimeFormat, nameDisplayOrder: nameDisplayOrder, context: arguments.context, peer: peer, presence: presence, text: .presence, label: .none, editing: ItemListPeerItemEditing(editable: false, editing: false, revealed: false), switchValue: nil, enabled: true, selectable: true, sectionId: self.section, action: nil, setPeerIdWithRevealedOptions: { _, _ in }, removePeer: { _ in }) return ItemListPeerItem(presentationData: presentationData, dateTimeFormat: dateTimeFormat, nameDisplayOrder: nameDisplayOrder, context: arguments.context, peer: peer, presence: presence, text: .presence, label: .none, editing: ItemListPeerItemEditing(editable: false, editing: false, revealed: false), switchValue: nil, enabled: true, selectable: true, sectionId: self.section, action: nil, setPeerIdWithRevealedOptions: { _, _ in }, removePeer: { _ in })
case let .locationHeader(theme, title): case let .locationHeader(_, title):
return ItemListSectionHeaderItem(presentationData: presentationData, text: title, sectionId: self.section) return ItemListSectionHeaderItem(presentationData: presentationData, text: title, sectionId: self.section)
case let .location(theme, location): case let .location(theme, location):
let imageSignal = chatMapSnapshotImage(account: arguments.context.account, resource: MapSnapshotMediaResource(latitude: location.latitude, longitude: location.longitude, width: 90, height: 90)) let imageSignal = chatMapSnapshotImage(account: arguments.context.account, resource: MapSnapshotMediaResource(latitude: location.latitude, longitude: location.longitude, width: 90, height: 90))
return ItemListAddressItem(theme: theme, label: "", text: location.address.replacingOccurrences(of: ", ", with: "\n"), imageSignal: imageSignal, selected: nil, sectionId: self.section, style: .blocks, action: nil) return ItemListAddressItem(theme: theme, label: "", text: location.address.replacingOccurrences(of: ", ", with: "\n"), imageSignal: imageSignal, selected: nil, sectionId: self.section, style: .blocks, action: nil)
case let .changeLocation(theme, text): case let .changeLocation(_, text):
return ItemListActionItem(presentationData: presentationData, title: text, kind: .generic, alignment: .natural, sectionId: ItemListSectionId(self.section), style: .blocks, action: { return ItemListActionItem(presentationData: presentationData, title: text, kind: .generic, alignment: .natural, sectionId: ItemListSectionId(self.section), style: .blocks, action: {
arguments.changeLocation() arguments.changeLocation()
}) })
case let .locationInfo(theme, text): case let .locationInfo(_, text):
return ItemListTextItem(presentationData: presentationData, text: .plain(text), sectionId: self.section) return ItemListTextItem(presentationData: presentationData, text: .plain(text), sectionId: self.section)
case let .venueHeader(theme, title): case let .venueHeader(_, title):
return ItemListSectionHeaderItem(presentationData: presentationData, text: title, sectionId: self.section) return ItemListSectionHeaderItem(presentationData: presentationData, text: title, sectionId: self.section)
case let .venue(_, theme, venue): case let .venue(_, _, venue):
return ItemListVenueItem(presentationData: presentationData, account: arguments.context.account, venue: venue, sectionId: self.section, style: .blocks, action: { return ItemListVenueItem(presentationData: presentationData, account: arguments.context.account, venue: venue, sectionId: self.section, style: .blocks, action: {
arguments.updateWithVenue(venue) arguments.updateWithVenue(venue)
}) })
@ -375,7 +375,6 @@ public func createGroupControllerImpl(context: AccountContext, peerIds: [PeerId]
var presentControllerImpl: ((ViewController, Any?) -> Void)? var presentControllerImpl: ((ViewController, Any?) -> Void)?
var pushImpl: ((ViewController) -> Void)? var pushImpl: ((ViewController) -> Void)?
var endEditingImpl: (() -> Void)? var endEditingImpl: (() -> Void)?
var clearHighlightImpl: (() -> Void)?
var ensureItemVisibleImpl: ((CreateGroupEntryTag, Bool) -> Void)? var ensureItemVisibleImpl: ((CreateGroupEntryTag, Bool) -> Void)?
let actionsDisposable = DisposableSet() let actionsDisposable = DisposableSet()
@ -777,7 +776,7 @@ public func createGroupControllerImpl(context: AccountContext, peerIds: [PeerId]
updateState { current in updateState { current in
var current = current var current = current
if current.editingName.isEmpty || current.nameSetFromVenue { if current.editingName.isEmpty || current.nameSetFromVenue {
current.editingName = .title(title: venueData.title ?? "", type: .group) current.editingName = .title(title: venueData.title, type: .group)
current.nameSetFromVenue = true current.nameSetFromVenue = true
} }
current.location = PeerGeoLocation(latitude: venue.latitude, longitude: venue.longitude, address: presentationData.strings.Map_Locating + "\n\n") current.location = PeerGeoLocation(latitude: venue.latitude, longitude: venue.longitude, address: presentationData.strings.Map_Locating + "\n\n")
@ -846,9 +845,6 @@ public func createGroupControllerImpl(context: AccountContext, peerIds: [PeerId]
[weak controller] in [weak controller] in
controller?.view.endEditing(true) controller?.view.endEditing(true)
} }
clearHighlightImpl = { [weak controller] in
controller?.clearItemNodesHighlight(animated: true)
}
ensureItemVisibleImpl = { [weak controller] targetTag, animated in ensureItemVisibleImpl = { [weak controller] targetTag, animated in
controller?.afterLayout({ controller?.afterLayout({
guard let controller = controller else { guard let controller = controller else {
@ -856,7 +852,6 @@ public func createGroupControllerImpl(context: AccountContext, peerIds: [PeerId]
} }
var resultItemNode: ListViewItemNode? var resultItemNode: ListViewItemNode?
let state = stateValue.with({ $0 })
let _ = controller.frameForItemNode({ itemNode in let _ = controller.frameForItemNode({ itemNode in
if let itemNode = itemNode as? ItemListItemNode { if let itemNode = itemNode as? ItemListItemNode {
if let tag = itemNode.tag, tag.isEqual(to: targetTag) { if let tag = itemNode.tag, tag.isEqual(to: targetTag) {

View File

@ -3,7 +3,6 @@ import SwiftSignalKit
import Postbox import Postbox
import TelegramCore import TelegramCore
import Contacts import Contacts
import AddressBook
import TelegramUIPreferences import TelegramUIPreferences
import DeviceAccess import DeviceAccess
import AccountContext import AccountContext
@ -308,157 +307,6 @@ private final class DeviceContactDataModernContext: DeviceContactDataContext {
} }
} }
private func withAddressBook(_ f: (ABAddressBook) -> Void) {
let addressBookRef = ABAddressBookCreateWithOptions(nil, nil)
if let addressBook = addressBookRef?.takeRetainedValue() {
f(addressBook)
}
}
private final class DeviceContactDataLegacyContext: DeviceContactDataContext {
var currentContacts: [DeviceContactStableId: DeviceContactBasicData] = [:]
init(queue: Queue, updated: @escaping ([DeviceContactStableId: DeviceContactBasicData]) -> Void) {
self.currentContacts = self.retrieveContacts()
updated(self.currentContacts)
/*let handle = NotificationCenter.default.addObserver(forName: NSNotification.Name.CNContactStoreDidChange, object: nil, queue: nil, using: { [weak self] _ in
queue.async {
guard let strongSelf = self else {
return
}
let contacts = strongSelf.retrieveContacts()
if strongSelf.currentContacts != contacts {
strongSelf.currentContacts = contacts
updated(strongSelf.currentContacts)
}
}
})*/
//self.updateHandle = handle
}
deinit {
/*if let updateHandle = updateHandle {
NotificationCenter.default.removeObserver(updateHandle)
}*/
}
private func retrieveContacts() -> [DeviceContactStableId: DeviceContactBasicData] {
var result: [DeviceContactStableId: DeviceContactBasicData] = [:]
withAddressBook { addressBook in
guard let peopleRef = ABAddressBookCopyArrayOfAllPeople(addressBook)?.takeRetainedValue() else {
return
}
for recordRef in peopleRef as NSArray {
let record = recordRef as ABRecord
let (stableId, basicData) = DeviceContactDataLegacyContext.parseContact(record)
result[stableId] = basicData
}
}
return result
}
private func getContactById(stableId: String) -> ABRecord? {
let recordId: ABRecordID
if stableId.hasPrefix("ab-"), let idValue = Int(String(stableId[stableId.index(stableId.startIndex, offsetBy: 3)])) {
recordId = Int32(clamping: idValue)
} else {
return nil
}
var result: ABRecord?
withAddressBook { addressBook in
result = ABAddressBookGetPersonWithRecordID(addressBook, recordId)?.takeUnretainedValue()
}
return result
}
private static func parseContact(_ contact: ABRecord) -> (DeviceContactStableId, DeviceContactBasicData) {
let stableId = "ab-\(ABRecordGetRecordID(contact))"
var firstName = ""
var lastName = ""
if let value = ABRecordCopyValue(contact, kABPersonFirstNameProperty)?.takeRetainedValue() {
firstName = value as! CFString as String
}
if let value = ABRecordCopyValue(contact, kABPersonLastNameProperty)?.takeRetainedValue() {
lastName = value as! CFString as String
}
var phoneNumbers: [DeviceContactPhoneNumberData] = []
if let value = ABRecordCopyValue(contact, kABPersonPhoneProperty)?.takeRetainedValue() {
let phones = value as ABMultiValue
let count = ABMultiValueGetCount(phones)
for i in 0 ..< count {
if let phoneRef = ABMultiValueCopyValueAtIndex(phones, i)?.takeRetainedValue() {
let phone = phoneRef as! CFString as String
var label = ""
if let labelRef = ABMultiValueCopyLabelAtIndex(phones, i)?.takeRetainedValue() {
label = labelRef as String
}
phoneNumbers.append(DeviceContactPhoneNumberData(label: label, value: phone))
}
}
}
return (stableId, DeviceContactBasicData(firstName: firstName, lastName: lastName, phoneNumbers: phoneNumbers))
}
func personNameDisplayOrder() -> PresentationPersonNameOrder {
if ABPersonGetCompositeNameFormat() == kABPersonCompositeNameFormatFirstNameFirst {
return .firstLast
} else {
return .lastFirst
}
}
func getExtendedContactData(stableId: DeviceContactStableId) -> DeviceContactExtendedData? {
if let contact = self.getContactById(stableId: stableId) {
let basicData = DeviceContactDataLegacyContext.parseContact(contact).1
return DeviceContactExtendedData(basicData: basicData, middleName: "", prefix: "", suffix: "", organization: "", jobTitle: "", department: "", emailAddresses: [], urls: [], addresses: [], birthdayDate: nil, socialProfiles: [], instantMessagingProfiles: [], note: "")
} else {
return nil
}
}
func appendContactData(_ contactData: DeviceContactExtendedData, to stableId: DeviceContactStableId) -> DeviceContactExtendedData? {
return nil
}
func appendPhoneNumber(_ phoneNumber: DeviceContactPhoneNumberData, to stableId: DeviceContactStableId) -> DeviceContactExtendedData? {
return nil
}
func createContactWithData(_ contactData: DeviceContactExtendedData) -> (DeviceContactStableId, DeviceContactExtendedData)? {
var result: (DeviceContactStableId, DeviceContactExtendedData)?
withAddressBook { addressBook in
let contact = ABPersonCreate()?.takeRetainedValue()
ABRecordSetValue(contact, kABPersonFirstNameProperty, contactData.basicData.firstName as CFString, nil)
ABRecordSetValue(contact, kABPersonLastNameProperty, contactData.basicData.lastName as CFString, nil)
let phones = ABMultiValueCreateMutable(ABPropertyType(kABMultiStringPropertyType))?.takeRetainedValue()
for phone in contactData.basicData.phoneNumbers {
ABMultiValueAddValueAndLabel(phones, phone.value as CFString, phone.label as CFString, nil)
}
ABRecordSetValue(contact, kABPersonPhoneProperty, phones, nil)
if ABAddressBookAddRecord(addressBook, contact, nil) {
ABAddressBookSave(addressBook, nil)
let stableId = "ab-\(ABRecordGetRecordID(contact))"
if let contact = self.getContactById(stableId: stableId) {
let parsedContact = DeviceContactDataLegacyContext.parseContact(contact).1
result = (stableId, DeviceContactExtendedData(basicData: parsedContact, middleName: "", prefix: "", suffix: "", organization: "", jobTitle: "", department: "", emailAddresses: [], urls: [], addresses: [], birthdayDate: nil, socialProfiles: [], instantMessagingProfiles: [], note: ""))
}
}
}
return result
}
func deleteContactWithAppSpecificReference(peerId: PeerId) {
}
}
private final class ExtendedContactDataContext { private final class ExtendedContactDataContext {
var value: DeviceContactExtendedData? var value: DeviceContactExtendedData?
let subscribers = Bag<(DeviceContactExtendedData) -> Void>() let subscribers = Bag<(DeviceContactExtendedData) -> Void>()
@ -507,30 +355,19 @@ private final class DeviceContactDataManagerPrivateImpl {
} }
strongSelf.accessInitialized = true strongSelf.accessInitialized = true
if authorizationStatus == .allowed { if authorizationStatus == .allowed {
if #available(iOSApplicationExtension 9.0, iOS 9.0, *) { let dataContext = DeviceContactDataModernContext(queue: strongSelf.queue, updated: { stableIdToBasicContactData in
let dataContext = DeviceContactDataModernContext(queue: strongSelf.queue, updated: { stableIdToBasicContactData in guard let strongSelf = self else {
guard let strongSelf = self else { return
return }
} strongSelf.updateAll(stableIdToBasicContactData)
strongSelf.updateAll(stableIdToBasicContactData) }, appSpecificReferencesUpdated: { appSpecificReferences in
}, appSpecificReferencesUpdated: { appSpecificReferences in guard let strongSelf = self else {
guard let strongSelf = self else { return
return }
} strongSelf.updateAppSpecificReferences(appSpecificReferences: appSpecificReferences)
strongSelf.updateAppSpecificReferences(appSpecificReferences: appSpecificReferences) })
}) strongSelf.dataContext = dataContext
strongSelf.dataContext = dataContext strongSelf.personNameDisplayOrder.set(dataContext.personNameDisplayOrder())
strongSelf.personNameDisplayOrder.set(dataContext.personNameDisplayOrder())
} else {
let dataContext = DeviceContactDataLegacyContext(queue: strongSelf.queue, updated: { stableIdToBasicContactData in
guard let strongSelf = self else {
return
}
strongSelf.updateAll(stableIdToBasicContactData)
})
strongSelf.dataContext = dataContext
strongSelf.personNameDisplayOrder.set(dataContext.personNameDisplayOrder())
}
} else { } else {
strongSelf.updateAll([:]) strongSelf.updateAll([:])
} }

View File

@ -125,26 +125,6 @@ final class CompactDocumentPreviewController: QLPreviewController, QLPreviewCont
self.delegate = self self.delegate = self
self.dataSource = self self.dataSource = self
/*self.navigationBar.barTintColor = theme.rootController.navigationBar.backgroundColor
self.navigationBar.tintColor = theme.rootController.navigationBar.accentTextColor
self.navigationBar.shadowImage = generateImage(CGSize(width: 1.0, height: 1.0), rotatedContext: { size, context in
context.clear(CGRect(origin: CGPoint(), size: size))
context.setFillColor(theme.rootController.navigationBar.separatorColor.cgColor)
context.fill(CGRect(origin: CGPoint(), size: CGSize(width: 1.0, height: UIScreenPixel)))
})
self.navigationBar.isTranslucent = false
self.navigationBar.titleTextAttributes = [NSAttributedString.Key.font: Font.semibold(17.0), NSAttributedString.Key.foregroundColor: theme.rootController.navigationBar.primaryTextColor]
controller.navigationItem.setLeftBarButton(UIBarButtonItem(title: strings.Common_Cancel, style: .plain, target: self, action: #selector(self.cancelPressed)), animated: false)
self.setViewControllers([controller], animated: false)*/
var pathExtension: String?
if let fileName = self.file.fileName {
let pathExtensionCandidate = (fileName as NSString).pathExtension
if !pathExtensionCandidate.isEmpty {
pathExtension = pathExtensionCandidate
}
}
if let path = self.postbox.mediaBox.completedResourcePath(self.file.resource) { if let path = self.postbox.mediaBox.completedResourcePath(self.file.resource) {
var updatedPath = path var updatedPath = path
if let fileName = self.file.fileName { if let fileName = self.file.fileName {

View File

@ -262,12 +262,7 @@ private final class DrawingStickersScreenNode: ViewControllerTracingNode {
} }
}, navigateBackToStickers: { }, navigateBackToStickers: {
}, setGifMode: { _ in }, setGifMode: { _ in
}, openSettings: { [weak self] in }, openSettings: {
if let strongSelf = self {
// let controller = installedStickerPacksController(context: context, mode: .modal)
// controller.navigationPresentation = .modal
// strongSelf.controllerInteraction.navigationController()?.pushViewController(controller)
}
}, toggleSearch: { [weak self] value, searchMode, query in }, toggleSearch: { [weak self] value, searchMode, query in
if let strongSelf = self { if let strongSelf = self {
if let searchMode = searchMode, value { if let searchMode = searchMode, value {
@ -379,13 +374,8 @@ private final class DrawingStickersScreenNode: ViewControllerTracingNode {
} }
}, navigateBackToStickers: { }, navigateBackToStickers: {
}, setGifMode: { _ in }, setGifMode: { _ in
}, openSettings: { [weak self] in }, openSettings: {
if let strongSelf = self { }, toggleSearch: { [weak self] value, searchMode, query in
// let controller = installedStickerPacksController(context: context, mode: .modal)
// controller.navigationPresentation = .modal
// strongSelf.controllerInteraction.navigationController()?.pushViewController(controller)
}
}, toggleSearch: { [weak self] value, searchMode, query in
if let strongSelf = self { if let strongSelf = self {
if let searchMode = searchMode, value { if let searchMode = searchMode, value {
var searchContainerNode: PaneSearchContainerNode? var searchContainerNode: PaneSearchContainerNode?
@ -967,14 +957,14 @@ private final class DrawingStickersScreenNode: ViewControllerTracingNode {
} }
func updateLayout(width: CGFloat, topInset: CGFloat, leftInset: CGFloat, rightInset: CGFloat, bottomInset: CGFloat, standardInputHeight: CGFloat, inputHeight: CGFloat, maximumHeight: CGFloat, inputPanelHeight: CGFloat, transition: ContainedViewLayoutTransition, deviceMetrics: DeviceMetrics, isVisible: Bool) -> (CGFloat, CGFloat) { func updateLayout(width: CGFloat, topInset: CGFloat, leftInset: CGFloat, rightInset: CGFloat, bottomInset: CGFloat, standardInputHeight: CGFloat, inputHeight: CGFloat, maximumHeight: CGFloat, inputPanelHeight: CGFloat, transition: ContainedViewLayoutTransition, deviceMetrics: DeviceMetrics, isVisible: Bool) -> (CGFloat, CGFloat) {
var searchMode: ChatMediaInputSearchMode? let searchMode: ChatMediaInputSearchMode? = nil
var displaySearch = false let displaySearch = false
let separatorHeight = max(UIScreenPixel, 1.0 - UIScreenPixel) let separatorHeight = max(UIScreenPixel, 1.0 - UIScreenPixel)
let topPanelHeight: CGFloat = 56.0 let topPanelHeight: CGFloat = 56.0
let panelHeight: CGFloat let panelHeight: CGFloat
var isExpanded: Bool = true let isExpanded: Bool = true
// switch expanded { // switch expanded {
// case .content: // case .content:
panelHeight = maximumHeight panelHeight = maximumHeight
@ -1006,8 +996,8 @@ private final class DrawingStickersScreenNode: ViewControllerTracingNode {
searchContainerNode.frame = containerFrame searchContainerNode.frame = containerFrame
searchContainerNode.updateLayout(size: containerFrame.size, leftInset: leftInset, rightInset: rightInset, bottomInset: bottomInset, inputHeight: inputHeight, deviceMetrics: deviceMetrics, transition: .immediate) searchContainerNode.updateLayout(size: containerFrame.size, leftInset: leftInset, rightInset: rightInset, bottomInset: bottomInset, inputHeight: inputHeight, deviceMetrics: deviceMetrics, transition: .immediate)
var placeholderNode: PaneSearchBarPlaceholderNode? var placeholderNode: PaneSearchBarPlaceholderNode?
var anchorTop = CGPoint(x: 0.0, y: 0.0) let anchorTop = CGPoint(x: 0.0, y: 0.0)
var anchorTopView: UIView = self.view let anchorTopView: UIView = self.view
if let searchMode = searchMode { if let searchMode = searchMode {
switch searchMode { switch searchMode {
case .sticker: case .sticker:
@ -1022,7 +1012,7 @@ private final class DrawingStickersScreenNode: ViewControllerTracingNode {
} }
if let placeholderNode = placeholderNode { if let placeholderNode = placeholderNode {
searchContainerNode.animateIn(from: placeholderNode, anchorTop: anchorTop, anhorTopView: anchorTopView, transition: transition, completion: { [weak self] in searchContainerNode.animateIn(from: placeholderNode, anchorTop: anchorTop, anhorTopView: anchorTopView, transition: transition, completion: {
}) })
} }
} }

View File

@ -295,7 +295,6 @@ private final class FeaturedStickersScreenNode: ViewControllerTracingNode {
guard let strongSelf = self, let info = info as? StickerPackCollectionInfo else { guard let strongSelf = self, let info = info as? StickerPackCollectionInfo else {
return return
} }
let account = strongSelf.context.account
if install { if install {
let _ = strongSelf.context.engine.stickers.addStickerPackInteractively(info: info, items: []).start() let _ = strongSelf.context.engine.stickers.addStickerPackInteractively(info: info, items: []).start()
} else { } else {
@ -593,14 +592,7 @@ private final class FeaturedStickersScreenNode: ViewControllerTracingNode {
return controller return controller
} }
return nil return nil
}, updateContent: { [weak self] content in }, updateContent: { _ in
if let strongSelf = self {
var item: StickerPreviewPeekItem?
if let content = content as? StickerPreviewPeekContent {
item = content.item
}
//strongSelf.updatePreviewingItem(item: item, animated: true)
}
})) }))
} }
@ -1095,7 +1087,6 @@ private final class FeaturedPaneSearchContentNode: ASDisplayNode {
guard let strongSelf = self else { guard let strongSelf = self else {
return return
} }
let account = strongSelf.context.account
if install { if install {
let _ = strongSelf.context.engine.stickers.addStickerPackInteractively(info: info, items: []).start() let _ = strongSelf.context.engine.stickers.addStickerPackInteractively(info: info, items: []).start()
} else { } else {

View File

@ -214,7 +214,6 @@ public func fetchVideoLibraryMediaResource(account: Account, resource: VideoLibr
} }
|> castError(MediaResourceDataFetchError.self) |> castError(MediaResourceDataFetchError.self)
|> mapToSignal { appConfiguration -> Signal<MediaResourceDataFetchResult, MediaResourceDataFetchError> in |> mapToSignal { appConfiguration -> Signal<MediaResourceDataFetchResult, MediaResourceDataFetchError> in
let config = VideoConversionConfiguration.with(appConfiguration: appConfiguration)
let signal = Signal<MediaResourceDataFetchResult, MediaResourceDataFetchError> { subscriber in let signal = Signal<MediaResourceDataFetchResult, MediaResourceDataFetchError> { subscriber in
subscriber.putNext(.reset) subscriber.putNext(.reset)
let fetchResult = PHAsset.fetchAssets(withLocalIdentifiers: [resource.localIdentifier], options: nil) let fetchResult = PHAsset.fetchAssets(withLocalIdentifiers: [resource.localIdentifier], options: nil)
@ -328,7 +327,6 @@ func fetchLocalFileVideoMediaResource(account: Account, resource: LocalFileVideo
} }
|> castError(MediaResourceDataFetchError.self) |> castError(MediaResourceDataFetchError.self)
|> mapToSignal { appConfiguration -> Signal<MediaResourceDataFetchResult, MediaResourceDataFetchError> in |> mapToSignal { appConfiguration -> Signal<MediaResourceDataFetchResult, MediaResourceDataFetchError> in
let config = VideoConversionConfiguration.with(appConfiguration: appConfiguration)
let signal = Signal<MediaResourceDataFetchResult, MediaResourceDataFetchError> { subscriber in let signal = Signal<MediaResourceDataFetchResult, MediaResourceDataFetchError> { subscriber in
subscriber.putNext(.reset) subscriber.putNext(.reset)
@ -522,7 +520,6 @@ func fetchLocalFileGifMediaResource(resource: LocalFileGifMediaResource) -> Sign
let disposable = MetaDisposable() let disposable = MetaDisposable()
if let data = try? Data(contentsOf: URL(fileURLWithPath: resource.path), options: Data.ReadingOptions.mappedIfSafe) { if let data = try? Data(contentsOf: URL(fileURLWithPath: resource.path), options: Data.ReadingOptions.mappedIfSafe) {
let updatedSize = Atomic<Int>(value: 0)
let signal = TGGifConverter.convertGif(toMp4: data)! let signal = TGGifConverter.convertGif(toMp4: data)!
let signalDisposable = signal.start(next: { next in let signalDisposable = signal.start(next: { next in
if let result = next as? NSDictionary, let path = result["path"] as? String { if let result = next as? NSDictionary, let path = result["path"] as? String {

View File

@ -149,7 +149,6 @@ final class HashtagChatInputPanelItemNode: ListViewItemNode {
let baseWidth = params.width - params.leftInset - params.rightInset let baseWidth = params.width - params.leftInset - params.rightInset
let leftInset: CGFloat = 15.0 + params.leftInset let leftInset: CGFloat = 15.0 + params.leftInset
let rightInset: CGFloat = 10.0 + params.rightInset
let (textLayout, textApply) = makeTextLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: "#\(item.text)", font: textFont, textColor: item.presentationData.theme.list.itemPrimaryTextColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: baseWidth, height: 100.0), alignment: .natural, cutout: nil, insets: UIEdgeInsets())) let (textLayout, textApply) = makeTextLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: "#\(item.text)", font: textFont, textColor: item.presentationData.theme.list.itemPrimaryTextColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: baseWidth, height: 100.0), alignment: .natural, cutout: nil, insets: UIEdgeInsets()))
@ -186,7 +185,7 @@ final class HashtagChatInputPanelItemNode: ListViewItemNode {
} }
func updateRevealOffset(offset: CGFloat, transition: ContainedViewLayoutTransition) { func updateRevealOffset(offset: CGFloat, transition: ContainedViewLayoutTransition) {
if let (size, leftInset, rightInset) = self.validLayout { if let (_, leftInset, _) = self.validLayout {
transition.updateFrameAdditive(node: self.textNode, frame: CGRect(origin: CGPoint(x: min(offset, 0.0) + 15.0 + leftInset, y: self.textNode.frame.minY), size: self.textNode.frame.size)) transition.updateFrameAdditive(node: self.textNode, frame: CGRect(origin: CGPoint(x: min(offset, 0.0) + 15.0 + leftInset, y: self.textNode.frame.minY), size: self.textNode.frame.size))
} }
} }
@ -194,7 +193,7 @@ final class HashtagChatInputPanelItemNode: ListViewItemNode {
override func setHighlighted(_ highlighted: Bool, at point: CGPoint, animated: Bool) { override func setHighlighted(_ highlighted: Bool, at point: CGPoint, animated: Bool) {
super.setHighlighted(highlighted, at: point, animated: animated) super.setHighlighted(highlighted, at: point, animated: animated)
if let revealNode = self.revealNode, self.revealOffset != 0 { if let _ = self.revealNode, self.revealOffset != 0 {
return return
} }
@ -225,7 +224,6 @@ final class HashtagChatInputPanelItemNode: ListViewItemNode {
if self.revealOptions == options { if self.revealOptions == options {
return return
} }
let previousOptions = self.revealOptions
let wasEmpty = self.revealOptions.isEmpty let wasEmpty = self.revealOptions.isEmpty
self.revealOptions = options self.revealOptions = options
let isEmpty = options.isEmpty let isEmpty = options.isEmpty
@ -374,7 +372,7 @@ final class HashtagChatInputPanelItemNode: ListViewItemNode {
private func updateRevealOffsetInternal(offset: CGFloat, transition: ContainedViewLayoutTransition) { private func updateRevealOffsetInternal(offset: CGFloat, transition: ContainedViewLayoutTransition) {
self.revealOffset = offset self.revealOffset = offset
guard let (size, leftInset, rightInset) = self.validLayout else { guard let (size, _, rightInset) = self.validLayout else {
return return
} }

View File

@ -191,7 +191,7 @@ final class HorizontalListContextResultsChatInputContextPanelNode: ChatInputCont
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Resend"), color: theme.actionSheet.primaryTextColor) return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Resend"), color: theme.actionSheet.primaryTextColor)
}, action: { _, f in }, action: { _, f in
f(.default) f(.default)
item.resultSelected(item.result, itemNode, itemNode.bounds) let _ = item.resultSelected(item.result, itemNode, itemNode.bounds)
}))) })))
selectedItemNodeAndContent = (itemNode, ChatContextResultPeekContent(account: item.account, contextResult: item.result, menu: menuItems)) selectedItemNodeAndContent = (itemNode, ChatContextResultPeekContent(account: item.account, contextResult: item.result, menu: menuItems))
} }

View File

@ -225,10 +225,8 @@ final class HorizontalStickerGridItemNode: GridItemNode {
} }
func updatePreviewing(animated: Bool) { func updatePreviewing(animated: Bool) {
var isPreviewing = false let isPreviewing = false
if let (_, item, _) = self.currentState {
//isPreviewing = item.isPreviewed(self.stickerItem)
}
if self.currentIsPreviewing != isPreviewing { if self.currentIsPreviewing != isPreviewing {
self.currentIsPreviewing = isPreviewing self.currentIsPreviewing = isPreviewing

View File

@ -217,7 +217,7 @@ func presentedLegacyShortcutCamera(context: AccountContext, saveCapturedMedia: B
legacyController?.dismiss() legacyController?.dismiss()
} }
controller.finishedWithResults = { [weak controller, weak parentController, weak legacyController] overlayController, selectionContext, editingContext, currentItem, _, _ in controller.finishedWithResults = { [weak parentController] overlayController, selectionContext, editingContext, currentItem, _, _ in
if let selectionContext = selectionContext, let editingContext = editingContext { if let selectionContext = selectionContext, let editingContext = editingContext {
let nativeGenerator = legacyAssetPickerItemGenerator() let nativeGenerator = legacyAssetPickerItemGenerator()
let signals = TGCameraController.resultSignals(for: selectionContext, editingContext: editingContext, currentItem: currentItem, storeAssets: saveCapturedMedia, saveEditedPhotos: saveEditedPhotos, descriptionGenerator: { _1, _2, _3, _4 in let signals = TGCameraController.resultSignals(for: selectionContext, editingContext: editingContext, currentItem: currentItem, storeAssets: saveCapturedMedia, saveEditedPhotos: saveEditedPhotos, descriptionGenerator: { _1, _2, _3, _4 in

View File

@ -197,7 +197,7 @@ func legacyInstantVideoController(theme: PresentationTheme, panelFrame: CGRect,
finalDuration = adjustments.trimEndValue - adjustments.trimStartValue finalDuration = adjustments.trimEndValue - adjustments.trimStartValue
} }
let adjustmentsData = MemoryBuffer(data: NSKeyedArchiver.archivedData(withRootObject: adjustments.dictionary())) let adjustmentsData = MemoryBuffer(data: NSKeyedArchiver.archivedData(withRootObject: adjustments.dictionary()!))
let digest = MemoryBuffer(data: adjustmentsData.md5Digest()) let digest = MemoryBuffer(data: adjustmentsData.md5Digest())
resourceAdjustments = VideoMediaResourceAdjustments(data: adjustmentsData, digest: digest) resourceAdjustments = VideoMediaResourceAdjustments(data: adjustmentsData, digest: digest)
} }

View File

@ -595,8 +595,8 @@ final class ManagedAudioRecorderContext {
func takeData() -> RecordedAudioData? { func takeData() -> RecordedAudioData? {
if self.oggWriter.writeFrame(nil, frameByteCount: 0) { if self.oggWriter.writeFrame(nil, frameByteCount: 0) {
var scaledSamplesMemory = malloc(100 * 2)! let scaledSamplesMemory = malloc(100 * 2)!
var scaledSamples: UnsafeMutablePointer<Int16> = scaledSamplesMemory.assumingMemoryBound(to: Int16.self) let scaledSamples: UnsafeMutablePointer<Int16> = scaledSamplesMemory.assumingMemoryBound(to: Int16.self)
defer { defer {
free(scaledSamplesMemory) free(scaledSamplesMemory)
} }

View File

@ -228,7 +228,7 @@ final class MentionChatInputPanelItemNode: ListViewItemNode {
} }
func updateRevealOffset(offset: CGFloat, transition: ContainedViewLayoutTransition) { func updateRevealOffset(offset: CGFloat, transition: ContainedViewLayoutTransition) {
if let (size, leftInset, _) = self.validLayout { if let (_, leftInset, _) = self.validLayout {
transition.updateFrameAdditive(node: self.avatarNode, frame: CGRect(origin: CGPoint(x: min(offset, 0.0) + 12.0 + leftInset, y: self.avatarNode.frame.minY), size: self.avatarNode.frame.size)) transition.updateFrameAdditive(node: self.avatarNode, frame: CGRect(origin: CGPoint(x: min(offset, 0.0) + 12.0 + leftInset, y: self.avatarNode.frame.minY), size: self.avatarNode.frame.size))
transition.updateFrameAdditive(node: self.textNode, frame: CGRect(origin: CGPoint(x: min(offset, 0.0) + 55.0 + leftInset, y: self.textNode.frame.minY), size: self.textNode.frame.size)) transition.updateFrameAdditive(node: self.textNode, frame: CGRect(origin: CGPoint(x: min(offset, 0.0) + 55.0 + leftInset, y: self.textNode.frame.minY), size: self.textNode.frame.size))
} }

View File

@ -224,11 +224,11 @@ private final class PeerInfoScreenLabeledValueItemNode: PeerInfoScreenItemNode {
} else { } else {
let fontSize: CGFloat = 17.0 let fontSize: CGFloat = 17.0
var baseFont = Font.regular(fontSize) let baseFont = Font.regular(fontSize)
var linkFont = baseFont let linkFont = baseFont
var boldFont = Font.medium(fontSize) let boldFont = Font.medium(fontSize)
var italicFont = Font.italic(fontSize) let italicFont = Font.italic(fontSize)
var boldItalicFont = Font.semiboldItalic(fontSize) let boldItalicFont = Font.semiboldItalic(fontSize)
let titleFixedFont = Font.monospace(fontSize) let titleFixedFont = Font.monospace(fontSize)
let entities = generateTextEntities(item.text, enabledTypes: enabledEntities) let entities = generateTextEntities(item.text, enabledTypes: enabledEntities)

View File

@ -179,7 +179,7 @@ final class PeerInfoGroupsInCommonPaneNode: ASDisplayNode, PeerInfoPaneNode {
} }
private func dequeueTransaction() { private func dequeueTransaction() {
guard let (layout, _, _) = self.currentParams, let transaction = self.enqueuedTransactions.first else { guard let _ = self.currentParams, let transaction = self.enqueuedTransactions.first else {
return return
} }

View File

@ -408,7 +408,6 @@ func peerInfoScreenSettingsData(context: AccountContext, peerId: PeerId, account
let proxySettings: ProxySettings = sharedPreferences.entries[SharedDataKeys.proxySettings] as? ProxySettings ?? ProxySettings.defaultSettings let proxySettings: ProxySettings = sharedPreferences.entries[SharedDataKeys.proxySettings] as? ProxySettings ?? ProxySettings.defaultSettings
let inAppNotificationSettings: InAppNotificationSettings = sharedPreferences.entries[ApplicationSpecificSharedDataKeys.inAppNotificationSettings] as? InAppNotificationSettings ?? InAppNotificationSettings.defaultSettings let inAppNotificationSettings: InAppNotificationSettings = sharedPreferences.entries[ApplicationSpecificSharedDataKeys.inAppNotificationSettings] as? InAppNotificationSettings ?? InAppNotificationSettings.defaultSettings
let experimentalUISettings: ExperimentalUISettings = sharedPreferences.entries[ApplicationSpecificSharedDataKeys.experimentalUISettings] as? ExperimentalUISettings ?? ExperimentalUISettings.defaultSettings
let unreadTrendingStickerPacks = featuredStickerPacks.reduce(0, { count, item -> Int in let unreadTrendingStickerPacks = featuredStickerPacks.reduce(0, { count, item -> Int in
return item.unread ? count + 1 : count return item.unread ? count + 1 : count
@ -644,7 +643,7 @@ func peerInfoScreenData(context: AccountContext, peerId: PeerId, strings: Presen
if currentInvitationsContext == nil { if currentInvitationsContext == nil {
var canManageInvitations = false var canManageInvitations = false
if let channel = peerViewMainPeer(peerView) as? TelegramChannel, let cachedData = peerView.cachedData as? CachedChannelData, channel.flags.contains(.isCreator) || (channel.adminRights?.rights.contains(.canInviteUsers) == true) { if let channel = peerViewMainPeer(peerView) as? TelegramChannel, let _ = peerView.cachedData as? CachedChannelData, channel.flags.contains(.isCreator) || (channel.adminRights?.rights.contains(.canInviteUsers) == true) {
canManageInvitations = true canManageInvitations = true
} }
if canManageInvitations { if canManageInvitations {
@ -1063,11 +1062,7 @@ func peerInfoHeaderButtons(peer: Peer?, cachedData: CachedPeerData?, isOpenedFro
result.append(.more) result.append(.more)
} }
} else if let group = peer as? TelegramGroup { } else if let group = peer as? TelegramGroup {
var canEditGroupInfo = false
var canEditMembers = false
var canAddMembers = false var canAddMembers = false
var isPublic = false
var isCreator = false
var hasVoiceChat = false var hasVoiceChat = false
var canStartVoiceChat = false var canStartVoiceChat = false
@ -1081,21 +1076,13 @@ func peerInfoHeaderButtons(peer: Peer?, cachedData: CachedPeerData?, isOpenedFro
canStartVoiceChat = true canStartVoiceChat = true
} }
} }
if case .creator = group.role {
isCreator = true
}
switch group.role { switch group.role {
case .admin, .creator: case .admin, .creator:
canEditGroupInfo = true
canEditMembers = true
canAddMembers = true canAddMembers = true
case .member: case .member:
break break
} }
if !group.hasBannedPermission(.banChangeInfo) {
canEditGroupInfo = true
}
if !group.hasBannedPermission(.banAddMembers) { if !group.hasBannedPermission(.banAddMembers) {
canAddMembers = true canAddMembers = true
} }

View File

@ -38,7 +38,7 @@ final class PeerInfoPaneWrapper {
} }
func update(size: CGSize, sideInset: CGFloat, bottomInset: CGFloat, visibleHeight: CGFloat, isScrollingLockedAtTop: Bool, expandProgress: CGFloat, presentationData: PresentationData, synchronous: Bool, transition: ContainedViewLayoutTransition) { func update(size: CGSize, sideInset: CGFloat, bottomInset: CGFloat, visibleHeight: CGFloat, isScrollingLockedAtTop: Bool, expandProgress: CGFloat, presentationData: PresentationData, synchronous: Bool, transition: ContainedViewLayoutTransition) {
if let (currentSize, currentSideInset, currentBottomInset, visibleHeight, currentIsScrollingLockedAtTop, currentExpandProgress, currentPresentationData) = self.appliedParams { if let (currentSize, currentSideInset, currentBottomInset, _, currentIsScrollingLockedAtTop, currentExpandProgress, currentPresentationData) = self.appliedParams {
if currentSize == size && currentSideInset == sideInset && currentBottomInset == bottomInset, currentIsScrollingLockedAtTop == isScrollingLockedAtTop && currentExpandProgress == expandProgress && currentPresentationData === presentationData { if currentSize == size && currentSideInset == sideInset && currentBottomInset == bottomInset, currentIsScrollingLockedAtTop == isScrollingLockedAtTop && currentExpandProgress == expandProgress && currentPresentationData === presentationData {
return return
} }
@ -180,11 +180,9 @@ final class PeerInfoPaneTabsContainerNode: ASDisplayNode {
self.currentParams = (paneList, selectedPane, presentationData) self.currentParams = (paneList, selectedPane, presentationData)
for specifier in paneList { for specifier in paneList {
let paneNode: PeerInfoPaneTabsContainerPaneNode let paneNode: PeerInfoPaneTabsContainerPaneNode
var wasAdded = false
if let current = self.paneNodes[specifier.key] { if let current = self.paneNodes[specifier.key] {
paneNode = current paneNode = current
} else { } else {
wasAdded = true
paneNode = PeerInfoPaneTabsContainerPaneNode(pressed: { [weak self] in paneNode = PeerInfoPaneTabsContainerPaneNode(pressed: { [weak self] in
self?.paneSelected(specifier.key) self?.paneSelected(specifier.key)
}) })
@ -597,7 +595,6 @@ final class PeerInfoPaneContainerNode: ASDisplayNode, UIGestureRecognizerDelegat
directionIsToRight = translation.x > size.width / 2.0 directionIsToRight = translation.x > size.width / 2.0
} }
} }
var updated = false
if let directionIsToRight = directionIsToRight { if let directionIsToRight = directionIsToRight {
var updatedIndex = currentIndex var updatedIndex = currentIndex
if directionIsToRight { if directionIsToRight {
@ -608,7 +605,6 @@ final class PeerInfoPaneContainerNode: ASDisplayNode, UIGestureRecognizerDelegat
let switchToKey = availablePanes[updatedIndex] let switchToKey = availablePanes[updatedIndex]
if switchToKey != self.currentPaneKey && self.currentPanes[switchToKey] != nil{ if switchToKey != self.currentPaneKey && self.currentPanes[switchToKey] != nil{
self.currentPaneKey = switchToKey self.currentPaneKey = switchToKey
updated = true
} }
} }
self.transitionFraction = 0.0 self.transitionFraction = 0.0
@ -787,8 +783,7 @@ final class PeerInfoPaneContainerNode: ASDisplayNode, UIGestureRecognizerDelegat
var paneSwitchAnimationOffset: CGFloat = 0.0 var paneSwitchAnimationOffset: CGFloat = 0.0
var updatedCurrentIndex = currentIndex var updatedCurrentIndex = currentIndex
var animatePaneTransitionOffset: CGFloat? if let pendingSwitchToPaneKey = self.pendingSwitchToPaneKey, let _ = self.currentPanes[pendingSwitchToPaneKey] {
if let pendingSwitchToPaneKey = self.pendingSwitchToPaneKey, let pane = self.currentPanes[pendingSwitchToPaneKey] {
self.pendingSwitchToPaneKey = nil self.pendingSwitchToPaneKey = nil
previousPaneKey = self.currentPaneKey previousPaneKey = self.currentPaneKey
self.currentPaneKey = pendingSwitchToPaneKey self.currentPaneKey = pendingSwitchToPaneKey
@ -821,7 +816,7 @@ final class PeerInfoPaneContainerNode: ASDisplayNode, UIGestureRecognizerDelegat
return return
} }
pane.isAnimatingOut = false pane.isAnimatingOut = false
if let (size, sideInset, bottomInset, visibleHeight, expansionFraction, presentationData, data) = strongSelf.currentParams { if let (_, _, _, _, _, _, data) = strongSelf.currentParams {
if let availablePanes = data?.availablePanes, let currentPaneKey = strongSelf.currentPaneKey, let currentIndex = availablePanes.firstIndex(of: currentPaneKey), let paneIndex = availablePanes.firstIndex(of: key), abs(paneIndex - currentIndex) <= 1 { if let availablePanes = data?.availablePanes, let currentPaneKey = strongSelf.currentPaneKey, let currentIndex = availablePanes.firstIndex(of: currentPaneKey), let paneIndex = availablePanes.firstIndex(of: key), abs(paneIndex - currentIndex) <= 1 {
} else { } else {
if let pane = strongSelf.currentPanes.removeValue(forKey: key) { if let pane = strongSelf.currentPanes.removeValue(forKey: key) {
@ -838,7 +833,7 @@ final class PeerInfoPaneContainerNode: ASDisplayNode, UIGestureRecognizerDelegat
transition.animateFrame(node: pane.node, from: paneFrame, to: paneFrame.offsetBy(dx: -paneSwitchAnimationOffset, dy: 0.0), completion: isAnimatingOut ? nil : { _ in transition.animateFrame(node: pane.node, from: paneFrame, to: paneFrame.offsetBy(dx: -paneSwitchAnimationOffset, dy: 0.0), completion: isAnimatingOut ? nil : { _ in
paneCompletion() paneCompletion()
}) })
} else if let previousPaneKey = previousPaneKey, key == self.currentPaneKey { } else if let _ = previousPaneKey, key == self.currentPaneKey {
pane.node.frame = adjustedFrame pane.node.frame = adjustedFrame
let isAnimatingOut = pane.isAnimatingOut let isAnimatingOut = pane.isAnimatingOut
pane.isAnimatingOut = true pane.isAnimatingOut = true

View File

@ -61,7 +61,7 @@ import TelegramCallsUI
import PeerInfoAvatarListNode import PeerInfoAvatarListNode
import PasswordSetupUI import PasswordSetupUI
protocol PeerInfoScreenItem: class { protocol PeerInfoScreenItem: AnyObject {
var id: AnyHashable { get } var id: AnyHashable { get }
func node() -> PeerInfoScreenItemNode func node() -> PeerInfoScreenItemNode
} }
@ -1188,7 +1188,6 @@ private func editingItems(data: PeerInfoScreenData?, context: AccountContext, pr
let ItemDiscussionGroup = 3 let ItemDiscussionGroup = 3
let ItemSignMessages = 4 let ItemSignMessages = 4
let ItemSignMessagesHelp = 5 let ItemSignMessagesHelp = 5
let ItemAutoremove = 6
if channel.flags.contains(.isCreator) { if channel.flags.contains(.isCreator) {
let linkText: String let linkText: String
@ -1261,7 +1260,6 @@ private func editingItems(data: PeerInfoScreenData?, context: AccountContext, pr
let ItemLocationHeader = 110 let ItemLocationHeader = 110
let ItemLocation = 111 let ItemLocation = 111
let ItemLocationSetup = 112 let ItemLocationSetup = 112
let ItemAutoremove = 113
let ItemDeleteGroup = 114 let ItemDeleteGroup = 114
let isCreator = channel.flags.contains(.isCreator) let isCreator = channel.flags.contains(.isCreator)
@ -1399,7 +1397,6 @@ private func editingItems(data: PeerInfoScreenData?, context: AccountContext, pr
let ItemPreHistory = 103 let ItemPreHistory = 103
let ItemPermissions = 104 let ItemPermissions = 104
let ItemAdmins = 105 let ItemAdmins = 105
let ItemAutoremove = 106
var canViewAdminsAndBanned = false var canViewAdminsAndBanned = false
@ -3077,7 +3074,7 @@ private final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewD
} }
var storedState: MediaPlaybackStoredState? var storedState: MediaPlaybackStoredState?
if let timestamp = timestamp { if let timestamp = timestamp {
storedState = MediaPlaybackStoredState(timestamp: timestamp, playbackRate: AudioPlaybackRate(playbackRate) ?? .x1) storedState = MediaPlaybackStoredState(timestamp: timestamp, playbackRate: AudioPlaybackRate(playbackRate))
} }
let _ = updateMediaPlaybackStoredStateInteractively(postbox: strongSelf.context.account.postbox, messageId: messageId, state: storedState).start() let _ = updateMediaPlaybackStoredStateInteractively(postbox: strongSelf.context.account.postbox, messageId: messageId, state: storedState).start()
}, editMedia: { [weak self] messageId, snapshots, transitionCompletion in }, editMedia: { [weak self] messageId, snapshots, transitionCompletion in
@ -3128,7 +3125,7 @@ private final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewD
} }
}) })
}), centralItemUpdated: { [weak self] messageId in }), centralItemUpdated: { [weak self] messageId in
self?.paneContainerNode.requestExpandTabs?() let _ = self?.paneContainerNode.requestExpandTabs?()
self?.paneContainerNode.currentPane?.node.ensureMessageIsVisible(id: messageId) self?.paneContainerNode.currentPane?.node.ensureMessageIsVisible(id: messageId)
})) }))
} }
@ -3159,7 +3156,7 @@ private final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewD
break break
} }
}, sendFile: nil, }, sendFile: nil,
sendSticker: { [weak self] f, sourceNode, sourceRect in sendSticker: { f, sourceNode, sourceRect in
return false return false
}, requestMessageActionUrlAuth: nil, }, requestMessageActionUrlAuth: nil,
joinVoiceChat: { peerId, invite, call in joinVoiceChat: { peerId, invite, call in
@ -3270,7 +3267,6 @@ private final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewD
cancelImpl = { [weak self] in cancelImpl = { [weak self] in
self?.resolvePeerByNameDisposable?.set(nil) self?.resolvePeerByNameDisposable?.set(nil)
} }
let account = self.context.account
disposable.set((resolveSignal disposable.set((resolveSignal
|> take(1) |> take(1)
|> mapToSignal { peer -> Signal<Peer?, NoError> in |> mapToSignal { peer -> Signal<Peer?, NoError> in
@ -3297,7 +3293,6 @@ private final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewD
if self.resolvePeerByNameDisposable == nil { if self.resolvePeerByNameDisposable == nil {
self.resolvePeerByNameDisposable = MetaDisposable() self.resolvePeerByNameDisposable = MetaDisposable()
} }
let account = self.context.account
var resolveSignal: Signal<Peer?, NoError> var resolveSignal: Signal<Peer?, NoError>
if let peerName = peerName { if let peerName = peerName {
resolveSignal = self.context.engine.peers.resolvePeerByName(name: peerName) resolveSignal = self.context.engine.peers.resolvePeerByName(name: peerName)
@ -6592,16 +6587,6 @@ public final class PeerInfoScreenImpl: ViewController, PeerInfoScreen {
drawPeerAvatarLetters(context: context, size: CGSize(width: size.width - inset * 2.0, height: size.height - inset * 2.0), font: avatarFont, letters: displayLetters, peerId: primary.1.id) drawPeerAvatarLetters(context: context, size: CGSize(width: size.width - inset * 2.0, height: size.height - inset * 2.0), font: avatarFont, letters: displayLetters, peerId: primary.1.id)
})?.withRenderingMode(.alwaysOriginal) })?.withRenderingMode(.alwaysOriginal)
let selectedImage = generateImage(size, rotatedContext: { size, context in
context.clear(CGRect(origin: CGPoint(), size: size))
context.translateBy(x: inset, y: inset)
drawPeerAvatarLetters(context: context, size: CGSize(width: size.width - inset * 2.0, height: size.height - inset * 2.0), font: avatarFont, letters: displayLetters, peerId: primary.1.id)
context.translateBy(x: -inset, y: -inset)
context.setLineWidth(1.0)
context.setStrokeColor(primary.2.rootController.tabBar.selectedIconColor.cgColor)
context.strokeEllipse(in: CGRect(x: 1.0, y: 1.0, width: 27.0, height: 27.0))
})?.withRenderingMode(.alwaysOriginal)
subscriber.putNext(image.flatMap { ($0, $0) }) subscriber.putNext(image.flatMap { ($0, $0) })
subscriber.putCompletion() subscriber.putCompletion()
return EmptyDisposable return EmptyDisposable
@ -7036,7 +7021,7 @@ private final class PeerInfoNavigationTransitionNode: ASDisplayNode, CustomNavig
transition.updateAlpha(node: self.headerNode.navigationButtonContainer, alpha: (1.0 - fraction)) transition.updateAlpha(node: self.headerNode.navigationButtonContainer, alpha: (1.0 - fraction))
if case let .animated(duration, _) = transition, (bottomNavigationBar.additionalContentNode.alpha.isZero || bottomNavigationBar.additionalContentNode.alpha == 1.0) { if case .animated = transition, (bottomNavigationBar.additionalContentNode.alpha.isZero || bottomNavigationBar.additionalContentNode.alpha == 1.0) {
bottomNavigationBar.additionalContentNode.alpha = fraction bottomNavigationBar.additionalContentNode.alpha = fraction
if fraction.isZero { if fraction.isZero {
bottomNavigationBar.additionalContentNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.15) bottomNavigationBar.additionalContentNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.15)

View File

@ -29,14 +29,6 @@ private enum PeerMessagesMediaPlaylistNavigation {
struct MessageMediaPlaylistItemStableId: Hashable { struct MessageMediaPlaylistItemStableId: Hashable {
let stableId: UInt32 let stableId: UInt32
var hashValue: Int {
return self.stableId.hashValue
}
static func ==(lhs: MessageMediaPlaylistItemStableId, rhs: MessageMediaPlaylistItemStableId) -> Bool {
return lhs.stableId == rhs.stableId
}
} }
private func extractFileMedia(_ message: Message) -> TelegramMediaFile? { private func extractFileMedia(_ message: Message) -> TelegramMediaFile? {
@ -736,12 +728,6 @@ final class PeerMessagesMediaPlaylist: SharedMediaPlaylist {
} }
if case .all = looping { if case .all = looping {
let viewIndex: HistoryViewInputAnchor
if case .earlier = navigation {
viewIndex = .upperBound
} else {
viewIndex = .lowerBound
}
return .single((nil, messages.count, false)) return .single((nil, messages.count, false))
} else { } else {
if hasMore { if hasMore {

View File

@ -286,10 +286,7 @@ final class PeerSelectionControllerNode: ASDisplayNode {
guard let textInputNode = textInputPanelNode.textInputNode else { guard let textInputNode = textInputPanelNode.textInputNode else {
return return
} }
let controller = ChatSendMessageActionSheetController(context: strongSelf.context, interfaceState: strongSelf.presentationInterfaceState, gesture: gesture, sourceSendButton: node, textInputNode: textInputNode, completion: { [weak self] in let controller = ChatSendMessageActionSheetController(context: strongSelf.context, interfaceState: strongSelf.presentationInterfaceState, gesture: gesture, sourceSendButton: node, textInputNode: textInputNode, completion: {
if let strongSelf = self {
// strongSelf.supportedOrientations = previousSupportedOrientations
}
}, sendMessage: { [weak textInputPanelNode] silently in }, sendMessage: { [weak textInputPanelNode] silently in
textInputPanelNode?.sendMessage(silently ? .silent : .generic) textInputPanelNode?.sendMessage(silently ? .silent : .generic)
}, schedule: { [weak textInputPanelNode] in }, schedule: { [weak textInputPanelNode] in

View File

@ -394,9 +394,7 @@ class PeerSelectionTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDel
self.validLayout = (width, leftInset, rightInset, additionalSideInsets, maxHeight, metrics, isSecondary) self.validLayout = (width, leftInset, rightInset, additionalSideInsets, maxHeight, metrics, isSecondary)
var transition = transition var transition = transition
var additionalOffset: CGFloat = 0.0
if let previousAdditionalSideInsets = previousAdditionalSideInsets, previousAdditionalSideInsets.right != additionalSideInsets.right { if let previousAdditionalSideInsets = previousAdditionalSideInsets, previousAdditionalSideInsets.right != additionalSideInsets.right {
additionalOffset = (previousAdditionalSideInsets.right - additionalSideInsets.right) / 3.0
if case .animated = transition { if case .animated = transition {
transition = .animated(duration: 0.2, curve: .easeInOut) transition = .animated(duration: 0.2, curve: .easeInOut)
@ -520,19 +518,13 @@ class PeerSelectionTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDel
textFieldMinHeight = calclulateTextFieldMinHeight(presentationInterfaceState, metrics: metrics) textFieldMinHeight = calclulateTextFieldMinHeight(presentationInterfaceState, metrics: metrics)
} }
let minimalHeight: CGFloat = 14.0 + textFieldMinHeight let minimalHeight: CGFloat = 14.0 + textFieldMinHeight
let minimalInputHeight: CGFloat = 2.0 + textFieldMinHeight
var animatedTransition = true
if case .immediate = transition {
animatedTransition = false
}
let baseWidth = width - leftInset - rightInset let baseWidth = width - leftInset - rightInset
let (accessoryButtonsWidth, textFieldHeight) = self.calculateTextFieldMetrics(width: baseWidth, maxHeight: maxHeight, metrics: metrics) let (_, textFieldHeight) = self.calculateTextFieldMetrics(width: baseWidth, maxHeight: maxHeight, metrics: metrics)
let panelHeight = self.panelHeight(textFieldHeight: textFieldHeight, metrics: metrics) let panelHeight = self.panelHeight(textFieldHeight: textFieldHeight, metrics: metrics)
var composeButtonsOffset: CGFloat = 0.0 let composeButtonsOffset: CGFloat = 0.0
var textInputBackgroundWidthOffset: CGFloat = 0.0 let textInputBackgroundWidthOffset: CGFloat = 0.0
self.updateCounterTextNode(transition: transition) self.updateCounterTextNode(transition: transition)
@ -542,8 +534,7 @@ class PeerSelectionTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDel
if let presentationInterfaceState = self.presentationInterfaceState { if let presentationInterfaceState = self.presentationInterfaceState {
self.actionButtons.updateLayout(size: CGSize(width: 44.0, height: minimalHeight), transition: transition, interfaceState: presentationInterfaceState) self.actionButtons.updateLayout(size: CGSize(width: 44.0, height: minimalHeight), transition: transition, interfaceState: presentationInterfaceState)
} }
let searchLayoutClearButtonSize = CGSize(width: 44.0, height: minimalHeight)
var textFieldInsets = self.textFieldInsets(metrics: metrics) var textFieldInsets = self.textFieldInsets(metrics: metrics)
if additionalSideInsets.right > 0.0 { if additionalSideInsets.right > 0.0 {
textFieldInsets.right += additionalSideInsets.right / 3.0 textFieldInsets.right += additionalSideInsets.right / 3.0
@ -619,7 +610,7 @@ class PeerSelectionTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDel
} }
if let (width, leftInset, rightInset, _, maxHeight, metrics, _) = self.validLayout { if let (width, leftInset, rightInset, _, maxHeight, metrics, _) = self.validLayout {
var composeButtonsOffset: CGFloat = 0.0 let composeButtonsOffset: CGFloat = 0.0
let (_, textFieldHeight) = self.calculateTextFieldMetrics(width: width - leftInset - rightInset, maxHeight: maxHeight, metrics: metrics) let (_, textFieldHeight) = self.calculateTextFieldMetrics(width: width - leftInset - rightInset, maxHeight: maxHeight, metrics: metrics)
let panelHeight = self.panelHeight(textFieldHeight: textFieldHeight, metrics: metrics) let panelHeight = self.panelHeight(textFieldHeight: textFieldHeight, metrics: metrics)

View File

@ -951,7 +951,7 @@ public class ShareRootControllerImpl {
strongSelf.mainWindow?.present(controller, on: .root) strongSelf.mainWindow?.present(controller, on: .root)
} else { } else {
let presentationData = internalContext.sharedContext.currentPresentationData.with { $0 } let presentationData = internalContext.sharedContext.currentPresentationData.with { $0 }
if let user = peer as? TelegramUser { if let _ = peer as? TelegramUser {
let text: String let text: String
switch result { switch result {
case .allowed: case .allowed:

View File

@ -1132,7 +1132,7 @@ public final class SharedAccountContextImpl: SharedAccountContext {
if !found { if !found {
let controllerParams = LocationViewParams(sendLiveLocation: { location in let controllerParams = LocationViewParams(sendLiveLocation: { location in
let outMessage: EnqueueMessage = .message(text: "", attributes: [], mediaReference: .standalone(media: location), replyToMessageId: nil, localGroupingKey: nil, correlationId: nil) //let outMessage: EnqueueMessage = .message(text: "", attributes: [], mediaReference: .standalone(media: location), replyToMessageId: nil, localGroupingKey: nil, correlationId: nil)
// params.enqueueMessage(outMessage) // params.enqueueMessage(outMessage)
}, stopLiveLocation: { messageId in }, stopLiveLocation: { messageId in
if let messageId = messageId { if let messageId = messageId {
@ -1376,7 +1376,7 @@ public final class SharedAccountContextImpl: SharedAccountContext {
let controller = generator(legacyController.context) let controller = generator(legacyController.context)
legacyController.bind(controller: controller) legacyController.bind(controller: controller)
legacyController.deferScreenEdgeGestures = [.top] legacyController.deferScreenEdgeGestures = [.top]
controller.selectionBlock = { [weak legacyController, weak controller] asset, _ in controller.selectionBlock = { [weak legacyController] asset, _ in
if let asset = asset { if let asset = asset {
let _ = (fetchPhotoLibraryImage(localIdentifier: asset.backingAsset.localIdentifier, thumbnail: false) let _ = (fetchPhotoLibraryImage(localIdentifier: asset.backingAsset.localIdentifier, thumbnail: false)
|> deliverOnMainQueue).start(next: { imageAndFlag in |> deliverOnMainQueue).start(next: { imageAndFlag in

View File

@ -90,7 +90,7 @@ private final class SpotlightIndexStorage {
func update(items: [PeerId: SpotlightIndexStorageItem]) { func update(items: [PeerId: SpotlightIndexStorageItem]) {
let validPeerIds = Set(items.keys) let validPeerIds = Set(items.keys)
var removePeerIds: [PeerId] = [] var removePeerIds: [PeerId] = []
for (peerId, item) in self.items { for (peerId, _) in self.items {
if !validPeerIds.contains(peerId) { if !validPeerIds.contains(peerId) {
removePeerIds.append(peerId) removePeerIds.append(peerId)
} }

View File

@ -125,7 +125,7 @@ final class StickersChatInputContextPanelItemNode: ListViewItemNode {
for i in 0 ..< self.nodes.count { for i in 0 ..< self.nodes.count {
if self.nodes[i].frame.contains(location) { if self.nodes[i].frame.contains(location) {
let file = item.files[i] let file = item.files[i]
item.interfaceInteraction.sendSticker(.standalone(media: file), true, self.nodes[i], self.nodes[i].bounds) let _ = item.interfaceInteraction.sendSticker(.standalone(media: file), true, self.nodes[i], self.nodes[i].bounds)
break break
} }
} }

View File

@ -45,7 +45,6 @@ private final class TonePlayerContext {
func start() { func start() {
do { do {
let currentVolume = AVAudioSession.sharedInstance().outputVolume
//let gainFactor = max(0.1, min(1.5, self.initialVolume / currentVolume)) //let gainFactor = max(0.1, min(1.5, self.initialVolume / currentVolume))
try self.audioEngine.start() try self.audioEngine.start()

View File

@ -105,7 +105,7 @@ final class WallpaperUploadManagerImpl: WallpaperUploadManager {
} }
let autoNightModeTriggered = presentationData.autoNightModeTriggered let autoNightModeTriggered = presentationData.autoNightModeTriggered
disposable.set(uploadSignal.start(next: { [weak self] status in disposable.set(uploadSignal.start(next: { status in
if case let .complete(wallpaper) = status { if case let .complete(wallpaper) = status {
let updateWallpaper: (TelegramWallpaper) -> Void = { wallpaper in let updateWallpaper: (TelegramWallpaper) -> Void = { wallpaper in
if let resource = wallpaper.mainResource { if let resource = wallpaper.mainResource {