From db832bfb17083a00e19949760f24ba4dd05e3589 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Fri, 12 Nov 2021 18:06:03 +0400 Subject: [PATCH] Various Improvements --- .../Telegram-iOS/en.lproj/Localizable.strings | 3 ++ .../Sources/ContextActionsContainerNode.swift | 9 +++++- .../ContextUI/Sources/ContextController.swift | 1 + .../TelegramUI/Sources/ChatController.swift | 28 +++++++++++++------ 4 files changed, 32 insertions(+), 9 deletions(-) diff --git a/Telegram/Telegram-iOS/en.lproj/Localizable.strings b/Telegram/Telegram-iOS/en.lproj/Localizable.strings index 6eb7f425c6..d65de18e29 100644 --- a/Telegram/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram/Telegram-iOS/en.lproj/Localizable.strings @@ -7056,3 +7056,6 @@ Sorry for the inconvenience."; "VoiceChat.DiscussionGroup" = "discussion group"; "Group.Edit.PrivatePublicLinkAlert" = "Please note that if you choose a public link for your group, anyone will be able to find it in search and join.\n\nDo not create this link if you want your group to stay private."; + +"Conversation.CopyProtectionInfoGroup" = "Admins restricted members to copy or forward content from this group."; +"Conversation.CopyProtectionInfoChannel" = "Admins restricted members to copy or forward content from this channel."; diff --git a/submodules/ContextUI/Sources/ContextActionsContainerNode.swift b/submodules/ContextUI/Sources/ContextActionsContainerNode.swift index 8510ecdd80..80212b6b9c 100644 --- a/submodules/ContextUI/Sources/ContextActionsContainerNode.swift +++ b/submodules/ContextUI/Sources/ContextActionsContainerNode.swift @@ -351,6 +351,7 @@ private final class InnerTextSelectionTipContainerNode: ASDisplayNode { self.presentationData = presentationData self.textNode = TextNode() + var icon: UIImage? switch tip { case .textSelection: var rawText = self.presentationData.strings.ChatContextMenu_TextSelectionTip @@ -362,15 +363,21 @@ private final class InnerTextSelectionTipContainerNode: ASDisplayNode { self.text = rawText self.targetSelectionIndex = 1 } + icon = UIImage(bundleImageName: "Chat/Context Menu/Tip") case .messageViewsPrivacy: self.text = self.presentationData.strings.ChatContextMenu_MessageViewsPrivacyTip self.targetSelectionIndex = nil + icon = UIImage(bundleImageName: "Chat/Context Menu/Tip") + case let .messageCopyProtection(isChannel): + self.text = isChannel ? self.presentationData.strings.Conversation_CopyProtectionInfoChannel : self.presentationData.strings.Conversation_CopyProtectionInfoGroup + self.targetSelectionIndex = nil + icon = UIImage(bundleImageName: "Chat/Context Menu/ReportCopyright") } self.iconNode = ASImageNode() self.iconNode.displaysAsynchronously = false self.iconNode.displayWithoutProcessing = true - self.iconNode.image = generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Tip"), color: presentationData.theme.contextMenu.primaryColor) + self.iconNode.image = generateTintedImage(image: icon, color: presentationData.theme.contextMenu.primaryColor) super.init() diff --git a/submodules/ContextUI/Sources/ContextController.swift b/submodules/ContextUI/Sources/ContextController.swift index b096fa94c4..f8dadf79d1 100644 --- a/submodules/ContextUI/Sources/ContextController.swift +++ b/submodules/ContextUI/Sources/ContextController.swift @@ -1828,6 +1828,7 @@ public final class ContextController: ViewController, StandalonePresentableContr public enum Tip { case textSelection case messageViewsPrivacy + case messageCopyProtection(isChannel: Bool) } public final class ActionsHeight { diff --git a/submodules/TelegramUI/Sources/ChatController.swift b/submodules/TelegramUI/Sources/ChatController.swift index 9ec1f36a7d..8525d4b2ed 100644 --- a/submodules/TelegramUI/Sources/ChatController.swift +++ b/submodules/TelegramUI/Sources/ChatController.swift @@ -280,7 +280,8 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G private var clearCacheDisposable: MetaDisposable? private var bankCardDisposable: MetaDisposable? private var hasActiveGroupCallDisposable: Disposable? - + private var sendAsPeersDisposable: Disposable? + private let editingMessage = ValuePromise(nil, ignoreRepeated: true) private let startingBot = ValuePromise(false, ignoreRepeated: true) private let unblockingPeer = ValuePromise(false, ignoreRepeated: true) @@ -943,11 +944,19 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G var tip: ContextController.Tip? if tip == nil { - let numberOfComponents = message.text.components(separatedBy: CharacterSet.whitespacesAndNewlines).count - let displayTextSelectionTip = numberOfComponents >= 3 && !message.text.isEmpty && chatTextSelectionTips < 3 && !message.isCopyProtected() - if displayTextSelectionTip { - let _ = ApplicationSpecificNotice.incrementChatTextSelectionTips(accountManager: strongSelf.context.sharedContext.accountManager).start() - tip = .textSelection + if message.isCopyProtected() { + var isChannel = false + if let channel = strongSelf.presentationInterfaceState.renderedPeer?.peer as? TelegramChannel, case .broadcast = channel.info { + isChannel = true + } + tip = .messageCopyProtection(isChannel: isChannel) + } else { + let numberOfComponents = message.text.components(separatedBy: CharacterSet.whitespacesAndNewlines).count + let displayTextSelectionTip = numberOfComponents >= 3 && !message.text.isEmpty && chatTextSelectionTips < 3 + if displayTextSelectionTip { + let _ = ApplicationSpecificNotice.incrementChatTextSelectionTips(accountManager: strongSelf.context.sharedContext.accountManager).start() + tip = .textSelection + } } } @@ -1145,7 +1154,8 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } }) } else { - strongSelf.sendMessages(messages) + let transformedMessages = strongSelf.transformEnqueueMessages(messages) + strongSelf.sendMessages(transformedMessages) } return true }, sendGif: { [weak self] fileReference, sourceNode, sourceRect, silentPosting, schedule in @@ -1180,6 +1190,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } }) } else { + messages = strongSelf.transformEnqueueMessages(messages) strongSelf.sendMessages(messages) } } @@ -4176,6 +4187,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G self.importStateDisposable?.dispose() self.nextChannelToReadDisposable?.dispose() self.inviteRequestsDisposable.dispose() + self.sendAsPeersDisposable?.dispose() } public func updatePresentationMode(_ mode: ChatControllerPresentationMode) { @@ -4565,7 +4577,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G return [FoundPeer(peer: peer, subscribers: nil)] } - let _ = (combineLatest(queue: Queue.mainQueue(), currentAccountPeer, self.context.account.postbox.peerView(id: self.chatLocation.peerId), self.context.engine.peers.sendAsAvailablePeers(peerId: self.chatLocation.peerId))) + self.sendAsPeersDisposable = (combineLatest(queue: Queue.mainQueue(), currentAccountPeer, self.context.account.postbox.peerView(id: self.chatLocation.peerId), self.context.engine.peers.sendAsAvailablePeers(peerId: self.chatLocation.peerId))) .start(next: { [weak self] currentAccountPeer, peerView, peers in guard let strongSelf = self else { return