mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-08 15:23:12 +00:00
Merge commit 'b57632c6702af4413e6bc39f197db9d99de9e704'
This commit is contained in:
commit
cfba93ccbf
@ -587,8 +587,12 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll
|
|||||||
} else if let media = media as? TelegramMediaFile, !media.isAnimated {
|
} else if let media = media as? TelegramMediaFile, !media.isAnimated {
|
||||||
for attribute in media.attributes {
|
for attribute in media.attributes {
|
||||||
switch attribute {
|
switch attribute {
|
||||||
case .Video:
|
case let .Video(_, dimensions, _):
|
||||||
canFullscreen = true
|
if dimensions.height > 0 {
|
||||||
|
if CGFloat(dimensions.width) / CGFloat(dimensions.height) > 1.33 {
|
||||||
|
canFullscreen = true
|
||||||
|
}
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@ -1114,7 +1118,7 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll
|
|||||||
}
|
}
|
||||||
|
|
||||||
var preferredAction = ShareControllerPreferredAction.default
|
var preferredAction = ShareControllerPreferredAction.default
|
||||||
var actionCompletionText: String = ""
|
var actionCompletionText: String?
|
||||||
if let generalMessageContentKind = generalMessageContentKind {
|
if let generalMessageContentKind = generalMessageContentKind {
|
||||||
switch generalMessageContentKind {
|
switch generalMessageContentKind {
|
||||||
case .image:
|
case .image:
|
||||||
@ -1164,6 +1168,7 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll
|
|||||||
} else if let image = content.image {
|
} else if let image = content.image {
|
||||||
subject = .media(.webPage(webPage: WebpageReference(webpage), media: image))
|
subject = .media(.webPage(webPage: WebpageReference(webpage), media: image))
|
||||||
preferredAction = .saveToCameraRoll
|
preferredAction = .saveToCameraRoll
|
||||||
|
actionCompletionText = strongSelf.presentationData.strings.Gallery_ImageSaved
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if let file = m as? TelegramMediaFile {
|
} else if let file = m as? TelegramMediaFile {
|
||||||
@ -1185,7 +1190,7 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll
|
|||||||
self?.interacting?(false)
|
self?.interacting?(false)
|
||||||
}
|
}
|
||||||
shareController.actionCompleted = { [weak self] in
|
shareController.actionCompleted = { [weak self] in
|
||||||
if let strongSelf = self {
|
if let strongSelf = self, let actionCompletionText = actionCompletionText {
|
||||||
let presentationData = strongSelf.context.sharedContext.currentPresentationData.with { $0 }
|
let presentationData = strongSelf.context.sharedContext.currentPresentationData.with { $0 }
|
||||||
strongSelf.controllerInteraction?.presentController(UndoOverlayController(presentationData: presentationData, content: .mediaSaved(text: actionCompletionText), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), nil)
|
strongSelf.controllerInteraction?.presentController(UndoOverlayController(presentationData: presentationData, content: .mediaSaved(text: actionCompletionText), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), nil)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -892,7 +892,7 @@ public final class ShareController: ViewController {
|
|||||||
} else {
|
} else {
|
||||||
context = self.sharedContext.makeTempAccountContext(account: self.currentAccount)
|
context = self.sharedContext.makeTempAccountContext(account: self.currentAccount)
|
||||||
}
|
}
|
||||||
self.controllerNode.transitionToProgressWithValue(signal: SaveToCameraRoll.saveToCameraRoll(context: context, postbox: context.account.postbox, mediaReference: mediaReference) |> map(Optional.init))
|
self.controllerNode.transitionToProgressWithValue(signal: SaveToCameraRoll.saveToCameraRoll(context: context, postbox: context.account.postbox, mediaReference: mediaReference) |> map(Optional.init), dismissImmediately: true)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func switchToAccount(account: Account, animateIn: Bool) {
|
private func switchToAccount(account: Account, animateIn: Bool) {
|
||||||
|
|||||||
@ -1995,12 +1995,17 @@ public final class VoiceChatController: ViewController {
|
|||||||
}
|
}
|
||||||
strongSelf.participantsNode.isHidden = !isLivestream
|
strongSelf.participantsNode.isHidden = !isLivestream
|
||||||
|
|
||||||
|
let hadPeer = strongSelf.peer != nil
|
||||||
strongSelf.peer = peer
|
strongSelf.peer = peer
|
||||||
strongSelf.currentTitleIsCustom = title != nil
|
strongSelf.currentTitleIsCustom = title != nil
|
||||||
strongSelf.currentTitle = title ?? peer.displayTitle(strings: strongSelf.presentationData.strings, displayOrder: strongSelf.presentationData.nameDisplayOrder)
|
strongSelf.currentTitle = title ?? peer.displayTitle(strings: strongSelf.presentationData.strings, displayOrder: strongSelf.presentationData.nameDisplayOrder)
|
||||||
|
|
||||||
strongSelf.updateTitle(transition: .immediate)
|
strongSelf.updateTitle(transition: .immediate)
|
||||||
strongSelf.titleNode.isRecording = isRecording
|
strongSelf.titleNode.isRecording = isRecording
|
||||||
|
|
||||||
|
if strongSelf.isScheduling && !hadPeer {
|
||||||
|
strongSelf.updateScheduleButtonTitle()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if !strongSelf.didSetDataReady {
|
if !strongSelf.didSetDataReady {
|
||||||
strongSelf.didSetDataReady = true
|
strongSelf.didSetDataReady = true
|
||||||
|
|||||||
@ -117,3 +117,17 @@ public extension NavigationControllerTheme {
|
|||||||
self.init(statusBar: navigationStatusBar, navigationBar: NavigationBarTheme(rootControllerTheme: presentationTheme), emptyAreaColor: presentationTheme.chatList.backgroundColor)
|
self.init(statusBar: navigationStatusBar, navigationBar: NavigationBarTheme(rootControllerTheme: presentationTheme), emptyAreaColor: presentationTheme.chatList.backgroundColor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public extension PresentationThemeBubbleColorComponents {
|
||||||
|
var hasSingleFillColor: Bool {
|
||||||
|
if self.fill.count == 1 {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
for i in 0 ..< self.fill.count - 1 {
|
||||||
|
if self.fill[i].argb != self.fill[i + 1].argb {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -433,7 +433,7 @@ public struct PresentationResourcesChat {
|
|||||||
return generateImage(CGSize(width: 33.0, height: 33.0), rotatedContext: { size, context in
|
return generateImage(CGSize(width: 33.0, height: 33.0), rotatedContext: { size, context in
|
||||||
context.clear(CGRect(origin: CGPoint(), size: size))
|
context.clear(CGRect(origin: CGPoint(), size: size))
|
||||||
let color: UIColor
|
let color: UIColor
|
||||||
if [.day, .night].contains(theme.referenceTheme.baseTheme) && theme.chat.message.outgoing.bubble.withWallpaper.fill.count > 1 {
|
if [.day, .night].contains(theme.referenceTheme.baseTheme) && !theme.chat.message.outgoing.bubble.withWallpaper.hasSingleFillColor {
|
||||||
color = .white
|
color = .white
|
||||||
} else {
|
} else {
|
||||||
color = theme.chat.inputPanel.actionControlForegroundColor
|
color = theme.chat.inputPanel.actionControlForegroundColor
|
||||||
@ -470,7 +470,7 @@ public struct PresentationResourcesChat {
|
|||||||
return generateImage(CGSize(width: 33.0, height: 33.0), rotatedContext: { size, context in
|
return generateImage(CGSize(width: 33.0, height: 33.0), rotatedContext: { size, context in
|
||||||
context.clear(CGRect(origin: CGPoint(), size: size))
|
context.clear(CGRect(origin: CGPoint(), size: size))
|
||||||
let color: UIColor
|
let color: UIColor
|
||||||
if [.day, .night].contains(theme.referenceTheme.baseTheme) && theme.chat.message.outgoing.bubble.withWallpaper.fill.count > 1 {
|
if [.day, .night].contains(theme.referenceTheme.baseTheme) && !theme.chat.message.outgoing.bubble.withWallpaper.hasSingleFillColor {
|
||||||
color = .white
|
color = .white
|
||||||
} else {
|
} else {
|
||||||
color = theme.chat.inputPanel.actionControlForegroundColor
|
color = theme.chat.inputPanel.actionControlForegroundColor
|
||||||
@ -515,7 +515,7 @@ public struct PresentationResourcesChat {
|
|||||||
context.translateBy(x: -imageRect.midX, y: -imageRect.midY)
|
context.translateBy(x: -imageRect.midX, y: -imageRect.midY)
|
||||||
|
|
||||||
let color: UIColor
|
let color: UIColor
|
||||||
if [.day, .night].contains(theme.referenceTheme.baseTheme) && theme.chat.message.outgoing.bubble.withWallpaper.fill.count > 1 {
|
if [.day, .night].contains(theme.referenceTheme.baseTheme) && !theme.chat.message.outgoing.bubble.withWallpaper.hasSingleFillColor {
|
||||||
color = .white
|
color = .white
|
||||||
} else {
|
} else {
|
||||||
color = theme.chat.inputPanel.actionControlForegroundColor
|
color = theme.chat.inputPanel.actionControlForegroundColor
|
||||||
|
|||||||
@ -3401,6 +3401,12 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
if !cachedGroupData.botInfos.isEmpty {
|
if !cachedGroupData.botInfos.isEmpty {
|
||||||
hasBots = true
|
hasBots = true
|
||||||
}
|
}
|
||||||
|
let botCommands = cachedGroupData.botInfos.reduce(into: [], { result, info in
|
||||||
|
result.append(contentsOf: info.botInfo.commands)
|
||||||
|
})
|
||||||
|
if !botCommands.isEmpty {
|
||||||
|
hasBotCommands = true
|
||||||
|
}
|
||||||
if case let .known(value) = cachedGroupData.autoremoveTimeout {
|
if case let .known(value) = cachedGroupData.autoremoveTimeout {
|
||||||
autoremoveTimeout = value?.effectiveValue
|
autoremoveTimeout = value?.effectiveValue
|
||||||
}
|
}
|
||||||
@ -3409,6 +3415,12 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
if !cachedChannelData.botInfos.isEmpty {
|
if !cachedChannelData.botInfos.isEmpty {
|
||||||
hasBots = true
|
hasBots = true
|
||||||
}
|
}
|
||||||
|
let botCommands = cachedChannelData.botInfos.reduce(into: [], { result, info in
|
||||||
|
result.append(contentsOf: info.botInfo.commands)
|
||||||
|
})
|
||||||
|
if !botCommands.isEmpty {
|
||||||
|
hasBotCommands = true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if case let .known(value) = cachedChannelData.autoremoveTimeout {
|
if case let .known(value) = cachedChannelData.autoremoveTimeout {
|
||||||
autoremoveTimeout = value?.effectiveValue
|
autoremoveTimeout = value?.effectiveValue
|
||||||
|
|||||||
@ -311,7 +311,7 @@ func inputTextPanelStateForChatPresentationInterfaceState(_ chatPresentationInte
|
|||||||
stickersEnabled = false
|
stickersEnabled = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if chatPresentationInterfaceState.hasBots {
|
if chatPresentationInterfaceState.hasBots && chatPresentationInterfaceState.hasBotCommands {
|
||||||
accessoryItems.append(.commands)
|
accessoryItems.append(.commands)
|
||||||
}
|
}
|
||||||
accessoryItems.append(.stickers(stickersEnabled))
|
accessoryItems.append(.stickers(stickersEnabled))
|
||||||
|
|||||||
@ -42,6 +42,8 @@ final class ChatTextInputActionButtonsNode: ASDisplayNode {
|
|||||||
self.micButton = ChatTextInputMediaRecordingButton(theme: theme, strings: strings, presentController: presentController)
|
self.micButton = ChatTextInputMediaRecordingButton(theme: theme, strings: strings, presentController: presentController)
|
||||||
|
|
||||||
self.sendContainerNode = ASDisplayNode()
|
self.sendContainerNode = ASDisplayNode()
|
||||||
|
self.sendContainerNode.layer.allowsGroupOpacity = true
|
||||||
|
|
||||||
self.backgroundNode = ASDisplayNode()
|
self.backgroundNode = ASDisplayNode()
|
||||||
self.backgroundNode.backgroundColor = theme.chat.inputPanel.actionControlFillColor
|
self.backgroundNode.backgroundColor = theme.chat.inputPanel.actionControlFillColor
|
||||||
self.backgroundNode.clipsToBounds = true
|
self.backgroundNode.clipsToBounds = true
|
||||||
@ -112,7 +114,7 @@ final class ChatTextInputActionButtonsNode: ASDisplayNode {
|
|||||||
|
|
||||||
self.backgroundNode.backgroundColor = theme.chat.inputPanel.actionControlFillColor
|
self.backgroundNode.backgroundColor = theme.chat.inputPanel.actionControlFillColor
|
||||||
|
|
||||||
if [.day, .night].contains(theme.referenceTheme.baseTheme) && theme.chat.message.outgoing.bubble.withWallpaper.fill.count > 1 {
|
if [.day, .night].contains(theme.referenceTheme.baseTheme) && !theme.chat.message.outgoing.bubble.withWallpaper.hasSingleFillColor {
|
||||||
self.backdropNode.isHidden = false
|
self.backdropNode.isHidden = false
|
||||||
} else {
|
} else {
|
||||||
self.backdropNode.isHidden = true
|
self.backdropNode.isHidden = true
|
||||||
|
|||||||
@ -165,7 +165,7 @@ private struct ThemeSettingsThemeItemNodeTransition {
|
|||||||
|
|
||||||
private func ensureThemeVisible(listNode: ListView, emoticon: String?, animated: Bool) -> Bool {
|
private func ensureThemeVisible(listNode: ListView, emoticon: String?, animated: Bool) -> Bool {
|
||||||
var resultNode: ThemeSettingsThemeItemIconNode?
|
var resultNode: ThemeSettingsThemeItemIconNode?
|
||||||
// var previousNode: ThemeSettingsThemeItemIconNode?
|
var previousNode: ThemeSettingsThemeItemIconNode?
|
||||||
var nextNode: ThemeSettingsThemeItemIconNode?
|
var nextNode: ThemeSettingsThemeItemIconNode?
|
||||||
listNode.forEachItemNode { node in
|
listNode.forEachItemNode { node in
|
||||||
guard let node = node as? ThemeSettingsThemeItemIconNode else {
|
guard let node = node as? ThemeSettingsThemeItemIconNode else {
|
||||||
@ -175,14 +175,22 @@ private func ensureThemeVisible(listNode: ListView, emoticon: String?, animated:
|
|||||||
if node.item?.emoticon == emoticon {
|
if node.item?.emoticon == emoticon {
|
||||||
resultNode = node
|
resultNode = node
|
||||||
} else {
|
} else {
|
||||||
// previousNode = node
|
previousNode = node
|
||||||
}
|
}
|
||||||
} else if nextNode == nil {
|
} else if nextNode == nil {
|
||||||
nextNode = node
|
nextNode = node
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if let resultNode = resultNode {
|
if let resultNode = resultNode {
|
||||||
listNode.ensureItemNodeVisible(resultNode, animated: animated, overflow: 57.0)
|
var nodeToEnsure = resultNode
|
||||||
|
if case let .visible(resultVisibility) = resultNode.visibility, resultVisibility == 1.0 {
|
||||||
|
if let previousNode = previousNode, case let .visible(previousVisibility) = previousNode.visibility, previousVisibility < 0.5 {
|
||||||
|
nodeToEnsure = previousNode
|
||||||
|
} else if let nextNode = nextNode, case let .visible(nextVisibility) = nextNode.visibility, nextVisibility < 0.5 {
|
||||||
|
nodeToEnsure = nextNode
|
||||||
|
}
|
||||||
|
}
|
||||||
|
listNode.ensureItemNodeVisible(nodeToEnsure, animated: animated, overflow: 57.0)
|
||||||
return true
|
return true
|
||||||
} else {
|
} else {
|
||||||
return false
|
return false
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user