mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Fix more warnings
This commit is contained in:
parent
0a9be38425
commit
895927cc04
@ -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)
|
||||||
|
@ -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 {
|
||||||
|
@ -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())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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 }
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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))
|
||||||
|
@ -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
|
||||||
|
@ -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:
|
||||||
|
@ -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
|
||||||
|
@ -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 {
|
||||||
|
@ -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))
|
||||||
|
@ -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 {
|
||||||
|
@ -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) {
|
||||||
|
@ -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([:])
|
||||||
}
|
}
|
||||||
|
@ -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 {
|
||||||
|
@ -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: {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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 {
|
||||||
|
@ -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 {
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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))
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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))
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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 {
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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:
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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()
|
||||||
|
@ -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 {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user