From e16bef63e732c0a3cc6ed55f2c4b30246db2f010 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Wed, 6 Jul 2022 13:00:49 +0200 Subject: [PATCH 1/8] Various improvements --- .../Sources/ViewControllerComponent.swift | 2 +- .../ContextControllerActionsStackNode.swift | 2 +- submodules/Emoji/Sources/EmojiUtils.swift | 2 +- .../PremiumUI/Sources/PremiumGiftScreen.swift | 103 +++++++++--------- .../Sources/PremiumIntroScreen.swift | 11 +- .../ChatMessageAnimatedStickerItemNode.swift | 3 +- .../WebUI/Sources/WebAppController.swift | 62 +++++++++++ 7 files changed, 127 insertions(+), 58 deletions(-) diff --git a/submodules/Components/ViewControllerComponent/Sources/ViewControllerComponent.swift b/submodules/Components/ViewControllerComponent/Sources/ViewControllerComponent.swift index a0677bdd9e..b635d9e54f 100644 --- a/submodules/Components/ViewControllerComponent/Sources/ViewControllerComponent.swift +++ b/submodules/Components/ViewControllerComponent/Sources/ViewControllerComponent.swift @@ -176,7 +176,7 @@ open class ViewControllerComponentContainer: ViewController { private let component: AnyComponent private var presentationDataDisposable: Disposable? - private var validLayout: ContainerViewLayout? + public private(set) var validLayout: ContainerViewLayout? public init(context: AccountContext, component: C, navigationBarAppearance: NavigationBarAppearance, statusBarStyle: StatusBarStyle = .default, theme: PresentationTheme? = nil) where C.EnvironmentType == ViewControllerComponentContainer.Environment { self.context = context diff --git a/submodules/ContextUI/Sources/ContextControllerActionsStackNode.swift b/submodules/ContextUI/Sources/ContextControllerActionsStackNode.swift index c69127b8c1..8989226abc 100644 --- a/submodules/ContextUI/Sources/ContextControllerActionsStackNode.swift +++ b/submodules/ContextUI/Sources/ContextControllerActionsStackNode.swift @@ -222,7 +222,7 @@ private final class ContextControllerActionsListActionItemNode: HighlightTrackin self.subtitleNode.attributedText = subtitle.flatMap { subtitle in return NSAttributedString( - string: self.item.text, + string: subtitle, font: subtitleFont, textColor: subtitleColor ) diff --git a/submodules/Emoji/Sources/EmojiUtils.swift b/submodules/Emoji/Sources/EmojiUtils.swift index 58ba322f87..fd58bb060f 100644 --- a/submodules/Emoji/Sources/EmojiUtils.swift +++ b/submodules/Emoji/Sources/EmojiUtils.swift @@ -5,7 +5,7 @@ import AVFoundation public extension UnicodeScalar { var isEmoji: Bool { switch self.value { - case 0x1F600...0x1F64F, 0x1F300...0x1F5FF, 0x1F680...0x1F6FF, 0x1F1E6...0x1F1FF, 0xE0020...0xE007F, 0xFE00...0xFE0F, 0x1F900...0x1F9FF, 0x1F018...0x1F0F5, 0x1F200...0x1F270, 65024...65039, 9100...9300, 8400...8447, 0x1F004, 0x1F18E, 0x1F191...0x1F19A, 0x1F5E8, 0x1FA70...0x1FA73, 0x1FA78...0x1FA7A, 0x1FA80...0x1FA82, 0x1FA90...0x1FA95: + case 0x1F600...0x1F64F, 0x1F300...0x1F5FF, 0x1F680...0x1F6FF, 0x1F1E6...0x1F1FF, 0xE0020...0xE007F, 0xFE00...0xFE0F, 0x1F900...0x1F9FF, 0x1F018...0x1F0F5, 0x1F200...0x1F270, 65024...65039, 9100...9300, 8400...8447, 0x1F004, 0x1F18E, 0x1F191...0x1F19A, 0x1F5E8, 0x1FA70...0x1FA73, 0x1FA78...0x1FA7A, 0x1FA80...0x1FA82, 0x1FA90...0x1FA95, 0x1F382: return true case 0x2603, 0x265F, 0x267E, 0x2692, 0x26C4, 0x26C8, 0x26CE, 0x26CF, 0x26D1...0x26D3, 0x26E9, 0x26F0...0x26F9, 0x2705, 0x270A, 0x270B, 0x2728, 0x274E, 0x2753...0x2755, 0x274C, 0x2795...0x2797, 0x27B0, 0x27BF: return true diff --git a/submodules/PremiumUI/Sources/PremiumGiftScreen.swift b/submodules/PremiumUI/Sources/PremiumGiftScreen.swift index 2439774bcd..26d5e627a9 100644 --- a/submodules/PremiumUI/Sources/PremiumGiftScreen.swift +++ b/submodules/PremiumUI/Sources/PremiumGiftScreen.swift @@ -538,7 +538,6 @@ private final class PremiumGiftScreenContentComponent: CombinedComponent { let fade = Child(RoundedRectangle.self) let text = Child(MultilineTextComponent.self) let section = Child(ProductGroupComponent.self) - let termsText = Child(MultilineTextComponent.self) return { context in let sideInset: CGFloat = 16.0 @@ -687,55 +686,7 @@ private final class PremiumGiftScreenContentComponent: CombinedComponent { size.height += section.size.height size.height += 23.0 - let textSideInset: CGFloat = 16.0 - let termsFont = Font.regular(13.0) - let termsTextColor = environment.theme.list.freeTextColor - let termsMarkdownAttributes = MarkdownAttributes(body: MarkdownAttributeSet(font: termsFont, textColor: termsTextColor), bold: MarkdownAttributeSet(font: termsFont, textColor: termsTextColor), link: MarkdownAttributeSet(font: termsFont, textColor: environment.theme.list.itemAccentColor), linkAttribute: { contents in - return (TelegramTextAttributes.URL, contents) - }) - - let termsString: MultilineTextComponent.TextContent = .markdown( - text: strings.Premium_Gift_Info, - attributes: termsMarkdownAttributes - ) - - let accountContext = component.context - let peerId = component.peer.id - let present = component.present - - let termsText = termsText.update( - component: MultilineTextComponent( - text: termsString, - horizontalAlignment: .center, - maximumNumberOfLines: 0, - lineSpacing: 0.0, - highlightColor: environment.theme.list.itemAccentColor.withAlphaComponent(0.3), - highlightAction: { attributes in - if let _ = attributes[NSAttributedString.Key(rawValue: TelegramTextAttributes.URL)] { - return NSAttributedString.Key(rawValue: TelegramTextAttributes.URL) - } else { - return nil - } - }, - tapAction: { attributes, _ in - if let _ = attributes[NSAttributedString.Key(rawValue: TelegramTextAttributes.URL)] as? String { - let controller = PremiumIntroScreen(context: accountContext, source: .profile(peerId)) - present(controller) - } - } - ), - environment: {}, - availableSize: CGSize(width: availableWidth - sideInsets - textSideInset * 2.0, height: .greatestFiniteMagnitude), - transition: context.transition - ) -// context.add(termsText -// .position(CGPoint(x: sideInset + environment.safeInsets.left + textSideInset + termsText.size.width / 2.0, y: size.height + termsText.size.height / 2.0)) -// ) - context.add(termsText - .position(CGPoint(x: sideInset + environment.safeInsets.left + textSideInset + termsText.size.width / 2.0, y: size.height + 164.0 + termsText.size.height / 2.0)) - ) - size.height += termsText.size.height size.height += 10.0 size.height += scrollEnvironment.insets.bottom @@ -885,7 +836,6 @@ private final class PremiumGiftScreenComponent: CombinedComponent { strongSelf.updateInProgress(false) strongSelf.updated(transition: .immediate) -// strongSelf.completion(duration) addAppLogEvent(postbox: strongSelf.context.account.postbox, type: "premium.promo_screen_fail") @@ -958,6 +908,7 @@ private final class PremiumGiftScreenComponent: CombinedComponent { let bottomPanel = Child(BlurredRectangle.self) let bottomSeparator = Child(Rectangle.self) let button = Child(SolidRoundedButtonComponent.self) + let termsText = Child(MultilineTextComponent.self) return { context in let environment = context.environment[EnvironmentType.self].value @@ -1098,7 +1049,7 @@ private final class PremiumGiftScreenComponent: CombinedComponent { .scale(titleScale) .opacity(titleAlpha) ) - + let price: String? if let products = state.products, let selectedProductId = state.selectedProductId, let product = products.first(where: { $0.id == selectedProductId }) { price = product.price @@ -1193,6 +1144,56 @@ private final class PremiumGiftScreenComponent: CombinedComponent { }) ) + if let _ = context.state.peer { + let accountContext = context.component.context + let present = context.component.present + + let sideInset: CGFloat = 16.0 + let textSideInset: CGFloat = 16.0 + let availableWidth = context.availableSize.width + let sideInsets = sideInset * 2.0 + environment.safeInsets.left + environment.safeInsets.right + + let termsFont = Font.regular(13.0) + let termsTextColor = environment.theme.list.freeTextColor + let termsMarkdownAttributes = MarkdownAttributes(body: MarkdownAttributeSet(font: termsFont, textColor: termsTextColor), bold: MarkdownAttributeSet(font: termsFont, textColor: termsTextColor), link: MarkdownAttributeSet(font: termsFont, textColor: environment.theme.list.itemAccentColor), linkAttribute: { contents in + return (TelegramTextAttributes.URL, contents) + }) + + let termsString: MultilineTextComponent.TextContent = .markdown( + text: environment.strings.Premium_Gift_Info, + attributes: termsMarkdownAttributes + ) + + let termsText = termsText.update( + component: MultilineTextComponent( + text: termsString, + horizontalAlignment: .center, + maximumNumberOfLines: 0, + lineSpacing: 0.0, + highlightColor: environment.theme.list.itemAccentColor.withAlphaComponent(0.3), + highlightAction: { attributes in + if let _ = attributes[NSAttributedString.Key(rawValue: TelegramTextAttributes.URL)] { + return NSAttributedString.Key(rawValue: TelegramTextAttributes.URL) + } else { + return nil + } + }, + tapAction: { attributes, _ in + if let _ = attributes[NSAttributedString.Key(rawValue: TelegramTextAttributes.URL)] as? String { + let controller = PremiumIntroScreen(context: accountContext, source: .giftTerms) + present(controller) + } + } + ), + environment: {}, + availableSize: CGSize(width: availableWidth - sideInsets - textSideInset * 2.0, height: .greatestFiniteMagnitude), + transition: context.transition + ) + context.add(termsText + .position(CGPoint(x: sideInset + environment.safeInsets.left + textSideInset + termsText.size.width / 2.0, y: context.availableSize.height - bottomPanel.size.height - termsText.size.height)) + ) + } + return context.availableSize } } diff --git a/submodules/PremiumUI/Sources/PremiumIntroScreen.swift b/submodules/PremiumUI/Sources/PremiumIntroScreen.swift index 0dcb18a9b6..44ff71410a 100644 --- a/submodules/PremiumUI/Sources/PremiumIntroScreen.swift +++ b/submodules/PremiumUI/Sources/PremiumIntroScreen.swift @@ -39,6 +39,7 @@ public enum PremiumSource: Equatable { case deeplink(String?) case profile(PeerId) case gift(from: PeerId, to: PeerId, duration: Int32) + case giftTerms var identifier: String? { switch self { @@ -74,7 +75,7 @@ public enum PremiumSource: Equatable { return "double_limits__about" case let .profile(id): return "profile__\(id.id._internalGetInt64Value())" - case .gift: + case .gift, .giftTerms: return nil case let .deeplink(reference): if let reference = reference { @@ -819,7 +820,9 @@ private final class PremiumIntroScreenContentComponent: CombinedComponent { let boldTextFont = Font.semibold(15.0) let textString: String - if let _ = context.component.otherPeerName { + if case .giftTerms = context.component.source { + textString = strings.Premium_PersonalDescription + } else if let _ = context.component.otherPeerName { if case let .gift(fromId, _, _) = context.component.source { if fromId == context.component.context.account.peerId { textString = strings.Premium_GiftedDescriptionYou @@ -1447,7 +1450,9 @@ private final class PremiumIntroScreenComponent: CombinedComponent { ) let titleString: String - if case .gift = context.component.source { + if case .giftTerms = context.component.source { + titleString = environment.strings.Premium_Title + } else if case .gift = context.component.source { titleString = environment.strings.Premium_GiftedTitle } else if state.isPremium == true { titleString = environment.strings.Premium_SubscribedTitle diff --git a/submodules/TelegramUI/Sources/ChatMessageAnimatedStickerItemNode.swift b/submodules/TelegramUI/Sources/ChatMessageAnimatedStickerItemNode.swift index 4bc9f720fa..e56e2408dc 100644 --- a/submodules/TelegramUI/Sources/ChatMessageAnimatedStickerItemNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageAnimatedStickerItemNode.swift @@ -1685,7 +1685,8 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { .offsetBy(dx: incomingMessage ? animationNode.frame.width - 10.0 : -animationNode.frame.width + 10.0, dy: 0.0) animationFrame = animationFrame.offsetBy(dx: CGFloat.random(in: -30.0 ... 30.0), dy: CGFloat.random(in: -30.0 ... 30.0)) } - + + animationFrame = animationFrame.offsetBy(dx: 0.0, dy: self.insets.top) additionalAnimationNode.frame = animationFrame if incomingMessage { additionalAnimationNode.transform = CATransform3DMakeScale(-1.0, 1.0, 1.0) diff --git a/submodules/WebUI/Sources/WebAppController.swift b/submodules/WebUI/Sources/WebAppController.swift index 216afd8217..dbf561cd29 100644 --- a/submodules/WebUI/Sources/WebAppController.swift +++ b/submodules/WebUI/Sources/WebAppController.swift @@ -723,6 +723,60 @@ public final class WebAppController: ViewController, AttachmentContainable { self.headerColorKey = colorKey self.updateHeaderBackgroundColor(transition: .animated(duration: 0.2, curve: .linear)) } + case "web_app_open_popup": + if let json = json, let message = json["message"] as? String, let buttons = json["buttons"] as? [Any] { + let presentationData = self.presentationData + + let title = json["title"] as? String + var alertButtons: [TextAlertAction] = [] + + for buttonJson in buttons { + if let button = buttonJson as? [String: Any], let id = button["id"] as? String, let type = button["type"] as? String { + let buttonAction = { + self.sendAlertButtonEvent(id: id) + } + let text = button["text"] as? String + switch type { + case "default": + if let text = text { + alertButtons.append(TextAlertAction(type: .genericAction, title: text, action: { + buttonAction() + })) + } + case "destructive": + if let text = text { + alertButtons.append(TextAlertAction(type: .destructiveAction, title: text, action: { + buttonAction() + })) + } + case "ok": + alertButtons.append(TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: { + buttonAction() + })) + case "cancel": + alertButtons.append(TextAlertAction(type: .genericAction, title: presentationData.strings.Common_Cancel, action: { + buttonAction() + })) + case "close": + alertButtons.append(TextAlertAction(type: .genericAction, title: presentationData.strings.Common_Close, action: { + buttonAction() + })) + default: + break + } + } + } + + var actionLayout: TextAlertContentActionLayout = .horizontal + if alertButtons.count > 2 { + actionLayout = .vertical + } + let alertController = textAlertController(context: self.context, updatedPresentationData: self.controller?.updatedPresentationData, title: title, text: message, actions: alertButtons, actionLayout: actionLayout) + alertController.dismissed = { + self.sendAlertButtonEvent(id: nil) + } + self.controller?.present(alertController, in: .window(.root)) + } default: break } @@ -834,6 +888,14 @@ public final class WebAppController: ViewController, AttachmentContainable { fileprivate func sendSettingsButtonEvent() { self.webView?.sendEvent(name: "settings_button_pressed", data: nil) } + + fileprivate func sendAlertButtonEvent(id: String?) { + var paramsString: String? + if let id = id { + paramsString = "{id: \"\(id)\"}" + } + self.webView?.sendEvent(name: "popup_closed", data: paramsString) + } } fileprivate var controllerNode: Node { From 0c2f2ec1b7d76af3d806d94d426ec25385d3a75a Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Wed, 6 Jul 2022 13:01:36 +0200 Subject: [PATCH 2/8] Update localization --- Telegram/Telegram-iOS/en.lproj/Localizable.strings | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Telegram/Telegram-iOS/en.lproj/Localizable.strings b/Telegram/Telegram-iOS/en.lproj/Localizable.strings index f9142b2715..d682f4bf7d 100644 --- a/Telegram/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram/Telegram-iOS/en.lproj/Localizable.strings @@ -7834,3 +7834,6 @@ Sorry for the inconvenience."; "Notification.PremiumGift.Title" = "Telegram Premium"; "Notification.PremiumGift.Subtitle" = "for %@"; "Notification.PremiumGift.View" = "View"; + +"Gallery.AirPlay" = "AirPlay"; +"Gallery.AirPlayPlaceholder" = "This video is playing on the TV using AirPlay"; From 9d41d0f110ce11dc79f355b5a4557c50d9289bb6 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Fri, 8 Jul 2022 14:30:49 +0200 Subject: [PATCH 3/8] Various improvements --- Telegram/Telegram-iOS/Resources/Gift.tgs | Bin 0 -> 53808 bytes .../Telegram-iOS/en.lproj/Localizable.strings | 3 + .../Items/UniversalVideoGalleryItem.swift | 186 ++++++++++------- .../PremiumUI/Sources/PremiumGiftScreen.swift | 21 +- .../Sources/PremiumIntroScreen.swift | 12 +- .../Components/MediaStreamComponent.swift | 27 ++- .../Components/Gift.imageset/Contents.json | 21 -- .../Components/Gift.imageset/gift.png | Bin 47754 -> 0 bytes .../AirPlay.imageset/Airplay.pdf | 188 ++++++++++++++++++ .../AirPlay.imageset/Contents.json | 12 ++ .../Sources/ChatMessageGiftItemNode.swift | 38 ++-- .../Sources/ExternalVideoPlayer.swift | 121 +++++++++++ .../WebUI/Sources/WebAppController.swift | 4 + 13 files changed, 510 insertions(+), 123 deletions(-) create mode 100644 Telegram/Telegram-iOS/Resources/Gift.tgs delete mode 100644 submodules/TelegramUI/Images.xcassets/Components/Gift.imageset/Contents.json delete mode 100644 submodules/TelegramUI/Images.xcassets/Components/Gift.imageset/gift.png create mode 100644 submodules/TelegramUI/Images.xcassets/Media Gallery/AirPlay.imageset/Airplay.pdf create mode 100644 submodules/TelegramUI/Images.xcassets/Media Gallery/AirPlay.imageset/Contents.json create mode 100644 submodules/TelegramUniversalVideoContent/Sources/ExternalVideoPlayer.swift diff --git a/Telegram/Telegram-iOS/Resources/Gift.tgs b/Telegram/Telegram-iOS/Resources/Gift.tgs new file mode 100644 index 0000000000000000000000000000000000000000..f0b6f7a3cb65ff72f3ffa346b15a77aacb43d5a9 GIT binary patch literal 53808 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 N{(sqI(4N)r1OV0nlJ5Wj literal 0 HcmV?d00001 diff --git a/Telegram/Telegram-iOS/en.lproj/Localizable.strings b/Telegram/Telegram-iOS/en.lproj/Localizable.strings index d682f4bf7d..3c0613cc7c 100644 --- a/Telegram/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram/Telegram-iOS/en.lproj/Localizable.strings @@ -7831,6 +7831,9 @@ Sorry for the inconvenience."; "Notification.PremiumGift.Sent" = "%1$@ sent you a gift for %2$@"; "Notification.PremiumGift.SentYou" = "You sent a gift for %@"; +"Notification.PremiumGift.Months_1" = "%@ month"; +"Notification.PremiumGift.Months_any" = "%@ months"; + "Notification.PremiumGift.Title" = "Telegram Premium"; "Notification.PremiumGift.Subtitle" = "for %@"; "Notification.PremiumGift.View" = "View"; diff --git a/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift b/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift index dba478408d..f0d487f5cd 100644 --- a/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift +++ b/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift @@ -147,10 +147,15 @@ private let moreButtonImage = generateTintedImage(image: UIImage(bundleImageName private let placeholderFont = Font.regular(16.0) private final class UniversalVideoGalleryItemPictureInPictureNode: ASDisplayNode { + enum Mode { + case pictureInPicture + case airplay + } + private let iconNode: ASImageNode private let textNode: ASTextNode - init(strings: PresentationStrings) { + init(strings: PresentationStrings, mode: Mode) { self.iconNode = ASImageNode() self.iconNode.isLayerBacked = true self.iconNode.displayWithoutProcessing = true @@ -160,10 +165,20 @@ private final class UniversalVideoGalleryItemPictureInPictureNode: ASDisplayNode self.textNode = ASTextNode() self.textNode.isUserInteractionEnabled = false self.textNode.displaysAsynchronously = false - self.textNode.attributedText = NSAttributedString(string: strings.Embed_PlayingInPIP, font: placeholderFont, textColor: UIColor(rgb: 0x8e8e93)) + + let text: String + switch mode { + case .pictureInPicture: + text = strings.Embed_PlayingInPIP + case .airplay: + text = strings.Gallery_AirPlayPlaceholder + } + self.textNode.attributedText = NSAttributedString(string: text, font: placeholderFont, textColor: UIColor(rgb: 0x8e8e93)) super.init() + self.backgroundColor = UIColor(rgb: 0x333335) + self.addSubnode(self.iconNode) self.addSubnode(self.textNode) } @@ -975,7 +990,8 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { if let pictureInPictureNode = self.pictureInPictureNode { if let item = self.item { - let placeholderSize = item.content.dimensions.fitted(layout.size) + var placeholderSize = item.content.dimensions.fitted(layout.size) + placeholderSize.height += 2.0 transition.updateFrame(node: pictureInPictureNode, frame: CGRect(origin: CGPoint(x: floor((layout.size.width - placeholderSize.width) / 2.0), y: floor((layout.size.height - placeholderSize.height) / 2.0)), size: placeholderSize)) pictureInPictureNode.updateLayout(placeholderSize, transition: transition) } @@ -1144,11 +1160,11 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { self.videoNode = videoNode self.videoNodeUserInteractionEnabled = disablePlayerControls || forceEnableUserInteraction videoNode.isUserInteractionEnabled = disablePlayerControls || forceEnableUserInteraction - videoNode.backgroundColor = videoNode.ownsContentNode ? UIColor.black : UIColor(rgb: 0x333335) + videoNode.backgroundColor = UIColor.black if item.fromPlayingVideo { videoNode.canAttachContent = false } else { - self.updateDisplayPlaceholder(!videoNode.ownsContentNode) + self.updateDisplayPlaceholder() } scrubberView.setStatusSignal(videoNode.status |> map { value -> MediaPlayerStatus in @@ -1492,21 +1508,25 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { self.videoNode?.notifyPlaybackControlsHidden(!isVisible) } + private func updateDisplayPlaceholder() { + self.updateDisplayPlaceholder(!(self.videoNode?.ownsContentNode ?? true) || self.isAirPlayActive) + } + private func updateDisplayPlaceholder(_ displayPlaceholder: Bool) { if displayPlaceholder && !self.disablePictureInPicturePlaceholder { if self.pictureInPictureNode == nil { - let pictureInPictureNode = UniversalVideoGalleryItemPictureInPictureNode(strings: self.presentationData.strings) + let pictureInPictureNode = UniversalVideoGalleryItemPictureInPictureNode(strings: self.presentationData.strings, mode: self.isAirPlayActive ? .airplay : .pictureInPicture) pictureInPictureNode.isUserInteractionEnabled = false self.pictureInPictureNode = pictureInPictureNode self.insertSubnode(pictureInPictureNode, aboveSubnode: self.scrollNode) if let validLayout = self.validLayout { if let item = self.item { - let placeholderSize = item.content.dimensions.fitted(validLayout.0.size) - pictureInPictureNode.frame = CGRect(origin: CGPoint(x: floor((validLayout.0.size.width - placeholderSize.width) / 2.0), y: floor((validLayout.0.size.height - placeholderSize.height) / 2.0)), size: placeholderSize) + var placeholderSize = item.content.dimensions.fitted(validLayout.0.size) + placeholderSize.height += 2.0 + pictureInPictureNode.frame = CGRect(origin: CGPoint(x: floor((validLayout.0.size.width - placeholderSize.width) / 2.0), y: floorToScreenPixels((validLayout.0.size.height - placeholderSize.height) / 2.0)), size: placeholderSize) pictureInPictureNode.updateLayout(placeholderSize, transition: .immediate) } } - self.videoNode?.backgroundColor = UIColor(rgb: 0x333335) } } else if let pictureInPictureNode = self.pictureInPictureNode { self.pictureInPictureNode = nil @@ -1602,10 +1622,10 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { } else { videoNode.continuePlayingWithoutSound() } - self.updateDisplayPlaceholder(!videoNode.ownsContentNode) + self.updateDisplayPlaceholder() } else if !item.fromPlayingVideo { videoNode.canAttachContent = isVisible - self.updateDisplayPlaceholder(!videoNode.ownsContentNode) + self.updateDisplayPlaceholder() } if self.shouldAutoplayOnCentrality() { self.hideStatusNodeUntilCentrality = true @@ -1690,7 +1710,7 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { videoNode.layer.animate(from: NSValue(caTransform3D: transform), to: NSValue(caTransform3D: videoNode.layer.transform), keyPath: "transform", timingFunction: kCAMediaTimingFunctionSpring, duration: 0.25) videoNode.canAttachContent = true - self.updateDisplayPlaceholder(!videoNode.ownsContentNode) + self.updateDisplayPlaceholder() self.context.sharedContext.mediaManager.setOverlayVideoNode(nil) } else { @@ -1768,7 +1788,7 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { if self.item?.fromPlayingVideo ?? false { Queue.mainQueue().after(0.001) { videoNode.canAttachContent = true - self.updateDisplayPlaceholder(!videoNode.ownsContentNode) + self.updateDisplayPlaceholder() } } @@ -2457,6 +2477,16 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { c.setItems(strongSelf.contextMenuSpeedItems() |> map { ContextController.Items(content: .list($0)) }, minHeight: nil) }))) + if #available(iOS 11.0, *) { + items.append(.action(ContextMenuActionItem(text: "AirPlay", textColor: .primary, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Media Gallery/AirPlay"), color: theme.contextMenu.primaryColor) }, action: { [weak self] _, f in + f(.default) + guard let strongSelf = self else { + return + } + strongSelf.beginAirPlaySetup() + }))) + } + if let (message, _, _) = strongSelf.contentInfo() { for media in message.media { if let webpage = media as? TelegramMediaWebpage, case let .Loaded(content) = webpage.content { @@ -2578,63 +2608,85 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { return items } } + + private var isAirPlayActive = false + private var externalVideoPlayer: ExternalVideoPlayer? + func beginAirPlaySetup() { + guard let content = self.item?.content as? NativeVideoContent else { + return + } + if #available(iOS 11.0, *) { + self.externalVideoPlayer = ExternalVideoPlayer(context: self.context, content: content) + self.externalVideoPlayer?.openRouteSelection() + self.externalVideoPlayer?.isActiveUpdated = { [weak self] isActive in + if let strongSelf = self { + if strongSelf.isAirPlayActive && !isActive { + strongSelf.externalVideoPlayer = nil + } + strongSelf.isAirPlayActive = isActive + strongSelf.updateDisplayPlaceholder() + } + } + } + } @objc func openStickersButtonPressed() { - if let content = self.item?.content as? NativeVideoContent { - let context = self.context - let media = content.fileReference.abstract - - let presentationData = self.context.sharedContext.currentPresentationData.with { $0 } - let topController = (self.baseNavigationController()?.topViewController as? ViewController) - let progressSignal = Signal { subscriber in - let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: nil)) - topController?.present(controller, in: .window(.root), with: nil) - return ActionDisposable { [weak controller] in - Queue.mainQueue().async() { - controller?.dismiss() - } - } - } - |> runOn(Queue.mainQueue()) - |> delay(0.15, queue: Queue.mainQueue()) - let progressDisposable = progressSignal.start() - - self.isInteractingPromise.set(true) - - let signal = self.context.engine.stickers.stickerPacksAttachedToMedia(media: media) - |> afterDisposed { - Queue.mainQueue().async { - progressDisposable.dispose() - } - } - let _ = (signal - |> deliverOnMainQueue).start(next: { [weak self] packs in - guard let strongSelf = self, !packs.isEmpty else { - return - } - let baseNavigationController = strongSelf.baseNavigationController() - baseNavigationController?.view.endEditing(true) - let controller = StickerPackScreen(context: strongSelf.context, mainStickerPack: packs[0], stickerPacks: packs, sendSticker: nil, actionPerformed: { info, items, action in - let animateInAsReplacement = false - switch action { - case .add: - topController?.present(UndoOverlayController(presentationData: presentationData, content: .stickersModified(title: presentationData.strings.StickerPackActionInfo_AddedTitle, text: presentationData.strings.StickerPackActionInfo_AddedText(info.title).string, undo: false, info: info, topItem: items.first, context: context), elevatedLayout: true, animateInAsReplacement: animateInAsReplacement, action: { _ in - return true - }), in: .window(.root)) - case let .remove(positionInList): - topController?.present(UndoOverlayController(presentationData: presentationData, content: .stickersModified(title: presentationData.strings.StickerPackActionInfo_RemovedTitle, text: presentationData.strings.StickerPackActionInfo_RemovedText(info.title).string, undo: true, info: info, topItem: items.first, context: context), elevatedLayout: true, animateInAsReplacement: animateInAsReplacement, action: { action in - if case .undo = action { - let _ = context.engine.stickers.addStickerPackInteractively(info: info, items: items, positionInList: positionInList).start() - } - return true - }), in: .window(.root)) - } - }, dismissed: { [weak self] in - self?.isInteractingPromise.set(false) - }) - (baseNavigationController?.topViewController as? ViewController)?.present(controller, in: .window(.root), with: nil) - }) + guard let content = self.item?.content as? NativeVideoContent else { + return } + let context = self.context + let media = content.fileReference.abstract + + let presentationData = self.context.sharedContext.currentPresentationData.with { $0 } + let topController = (self.baseNavigationController()?.topViewController as? ViewController) + let progressSignal = Signal { subscriber in + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: nil)) + topController?.present(controller, in: .window(.root), with: nil) + return ActionDisposable { [weak controller] in + Queue.mainQueue().async() { + controller?.dismiss() + } + } + } + |> runOn(Queue.mainQueue()) + |> delay(0.15, queue: Queue.mainQueue()) + let progressDisposable = progressSignal.start() + + self.isInteractingPromise.set(true) + + let signal = self.context.engine.stickers.stickerPacksAttachedToMedia(media: media) + |> afterDisposed { + Queue.mainQueue().async { + progressDisposable.dispose() + } + } + let _ = (signal + |> deliverOnMainQueue).start(next: { [weak self] packs in + guard let strongSelf = self, !packs.isEmpty else { + return + } + let baseNavigationController = strongSelf.baseNavigationController() + baseNavigationController?.view.endEditing(true) + let controller = StickerPackScreen(context: strongSelf.context, mainStickerPack: packs[0], stickerPacks: packs, sendSticker: nil, actionPerformed: { info, items, action in + let animateInAsReplacement = false + switch action { + case .add: + topController?.present(UndoOverlayController(presentationData: presentationData, content: .stickersModified(title: presentationData.strings.StickerPackActionInfo_AddedTitle, text: presentationData.strings.StickerPackActionInfo_AddedText(info.title).string, undo: false, info: info, topItem: items.first, context: context), elevatedLayout: true, animateInAsReplacement: animateInAsReplacement, action: { _ in + return true + }), in: .window(.root)) + case let .remove(positionInList): + topController?.present(UndoOverlayController(presentationData: presentationData, content: .stickersModified(title: presentationData.strings.StickerPackActionInfo_RemovedTitle, text: presentationData.strings.StickerPackActionInfo_RemovedText(info.title).string, undo: true, info: info, topItem: items.first, context: context), elevatedLayout: true, animateInAsReplacement: animateInAsReplacement, action: { action in + if case .undo = action { + let _ = context.engine.stickers.addStickerPackInteractively(info: info, items: items, positionInList: positionInList).start() + } + return true + }), in: .window(.root)) + } + }, dismissed: { [weak self] in + self?.isInteractingPromise.set(false) + }) + (baseNavigationController?.topViewController as? ViewController)?.present(controller, in: .window(.root), with: nil) + }) } override func adjustForPreviewing() { diff --git a/submodules/PremiumUI/Sources/PremiumGiftScreen.swift b/submodules/PremiumUI/Sources/PremiumGiftScreen.swift index 26d5e627a9..a1188dd1ef 100644 --- a/submodules/PremiumUI/Sources/PremiumGiftScreen.swift +++ b/submodules/PremiumUI/Sources/PremiumGiftScreen.swift @@ -799,11 +799,11 @@ private final class PremiumGiftScreenComponent: CombinedComponent { let duration: Int32 switch product.id { case "org.telegram.telegramPremium.twelveMonths": - duration = 86400 * 365 + duration = 12 case "org.telegram.telegramPremium.sixMonths": - duration = 86400 * 180 + duration = 6 case "org.telegram.telegramPremium.threeMonths": - duration = 86400 * 90 + duration = 3 default: duration = 0 } @@ -1259,13 +1259,16 @@ public final class PremiumGiftScreen: ViewControllerComponentContainer { } completionImpl = { [weak self] duration in - if let strongSelf = self { - let navigationController = strongSelf.navigationController - strongSelf.dismiss() - let introController = PremiumIntroScreen(context: context, source: .gift(from: context.account.peerId, to: peerId, duration: duration)) - navigationController?.pushViewController(introController, animated: true) + if let strongSelf = self, let navigationController = strongSelf.navigationController as? NavigationController { +// let introController = PremiumIntroScreen(context: context, source: .gift(from: context.account.peerId, to: peerId, duration: duration)) + var controllers = navigationController.viewControllers + controllers = controllers.filter { !($0 is PeerInfoScreen) && !($0 is PremiumGiftScreen) } + navigationController.setViewControllers(controllers, animated: true) + Queue.mainQueue().after(0.1, { - introController.view.addSubview(ConfettiView(frame: introController.view.bounds)) + if let topController = navigationController.viewControllers.first { + topController.view.addSubview(ConfettiView(frame: topController.view.bounds)) + } }) } } diff --git a/submodules/PremiumUI/Sources/PremiumIntroScreen.swift b/submodules/PremiumUI/Sources/PremiumIntroScreen.swift index 44ff71410a..1d38ee523a 100644 --- a/submodules/PremiumUI/Sources/PremiumIntroScreen.swift +++ b/submodules/PremiumUI/Sources/PremiumIntroScreen.swift @@ -1487,21 +1487,21 @@ private final class PremiumIntroScreenComponent: CombinedComponent { secondaryTitleText = environment.strings.Premium_PersonalTitle(otherPeerName).string } else if case let .gift(fromPeerId, _, duration) = context.component.source { if fromPeerId == context.component.context.account.peerId { - if duration >= 86400 * 365 { + if duration == 12 { secondaryTitleText = environment.strings.Premium_GiftedTitleYou_12Month(otherPeerName).string - } else if duration >= 86400 * 180 { + } else if duration == 6 { secondaryTitleText = environment.strings.Premium_GiftedTitleYou_6Month(otherPeerName).string - } else if duration >= 86400 * 90 { + } else if duration == 3 { secondaryTitleText = environment.strings.Premium_GiftedTitleYou_3Month(otherPeerName).string } else { secondaryTitleText = "" } } else { - if duration >= 86400 * 365 { + if duration == 12 { secondaryTitleText = environment.strings.Premium_GiftedTitle_12Month(otherPeerName).string - } else if duration >= 86400 * 180 { + } else if duration == 6 { secondaryTitleText = environment.strings.Premium_GiftedTitle_6Month(otherPeerName).string - } else if duration >= 86400 * 90 { + } else if duration == 3 { secondaryTitleText = environment.strings.Premium_GiftedTitle_3Month(otherPeerName).string } else { secondaryTitleText = "" diff --git a/submodules/TelegramCallsUI/Sources/Components/MediaStreamComponent.swift b/submodules/TelegramCallsUI/Sources/Components/MediaStreamComponent.swift index 930de2caa4..e9992927ac 100644 --- a/submodules/TelegramCallsUI/Sources/Components/MediaStreamComponent.swift +++ b/submodules/TelegramCallsUI/Sources/Components/MediaStreamComponent.swift @@ -1190,8 +1190,21 @@ public final class MediaStreamComponentController: ViewControllerComponentContai view.expandFromPictureInPicture() } + if let validLayout = self.validLayout { + self.view.clipsToBounds = true + self.view.layer.cornerRadius = validLayout.deviceMetrics.screenCornerRadius + if #available(iOS 13.0, *) { + self.view.layer.cornerCurve = .continuous + } + + self.view.layer.animatePosition(from: CGPoint(x: 353.0, y: 117.0), to: self.view.center, duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring, completion: { [weak self] _ in + self?.view.layer.cornerRadius = 0.0 + }) + self.view.layer.animateScale(from: 0.001, to: 1.0, duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring) + } + self.view.layer.allowsGroupOpacity = true - self.view.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.25, completion: { [weak self] _ in + self.view.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2, completion: { [weak self] _ in guard let strongSelf = self else { return } @@ -1226,6 +1239,18 @@ public final class MediaStreamComponentController: ViewControllerComponentContai strongSelf.view.layer.allowsGroupOpacity = false strongSelf.dismissImpl(completion: completion) }) + + if let validLayout = self.validLayout { + self.view.clipsToBounds = true + self.view.layer.cornerRadius = validLayout.deviceMetrics.screenCornerRadius + if #available(iOS 13.0, *) { + self.view.layer.cornerCurve = .continuous + } + + self.view.layer.animatePosition(from: self.view.center, to: CGPoint(x: 353.0, y: 117.0), duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring, completion: { _ in + }) + self.view.layer.animateScale(from: 1.0, to: 0.001, duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring) + } } private func dismissImpl(completion: (() -> Void)? = nil) { diff --git a/submodules/TelegramUI/Images.xcassets/Components/Gift.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Components/Gift.imageset/Contents.json deleted file mode 100644 index 74c463b66f..0000000000 --- a/submodules/TelegramUI/Images.xcassets/Components/Gift.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "gift.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/submodules/TelegramUI/Images.xcassets/Components/Gift.imageset/gift.png b/submodules/TelegramUI/Images.xcassets/Components/Gift.imageset/gift.png deleted file mode 100644 index a31babda90031ee20a4069c04bdafb257dd25042..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47754 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 +endobj + +2 0 obj + << /Length 3 0 R >> +stream +/DeviceRGB CS +/DeviceRGB cs +q +1.000000 0.000000 -0.000000 1.000000 2.335022 2.334961 cm +0.000000 0.000000 0.000000 scn +3.865000 17.330078 m +3.837526 17.330078 l +3.300828 17.330086 2.857980 17.330093 2.497252 17.300621 c +2.122623 17.270012 1.778399 17.204330 1.455116 17.039610 c +0.953664 16.784107 0.545970 16.376415 0.290468 15.874963 c +0.125747 15.551680 0.060066 15.207455 0.029457 14.832827 c +-0.000016 14.472098 -0.000009 14.029249 0.000000 13.492552 c +0.000000 13.465077 l +0.000000 7.865078 l +0.000000 7.837605 l +-0.000009 7.300907 -0.000016 6.858058 0.029457 6.497330 c +0.060066 6.122702 0.125747 5.778477 0.290468 5.455194 c +0.545970 4.953741 0.953664 4.546048 1.455116 4.290545 c +1.778399 4.125825 2.122623 4.060143 2.497252 4.029535 c +2.857977 4.000063 3.300821 4.000070 3.837511 4.000078 c +3.837541 4.000078 l +3.865000 4.000078 l +4.665000 4.000078 l +5.032270 4.000078 5.330000 4.297809 5.330000 4.665078 c +5.330000 5.032348 5.032270 5.330078 4.665000 5.330078 c +3.865000 5.330078 l +3.293975 5.330078 2.905699 5.330595 2.605556 5.355118 c +2.313176 5.379006 2.163463 5.422318 2.058923 5.475584 c +1.807727 5.603576 1.603498 5.807804 1.475507 6.059001 c +1.422241 6.163542 1.378929 6.313254 1.355040 6.605635 c +1.330518 6.905777 1.330000 7.294052 1.330000 7.865078 c +1.330000 13.465077 l +1.330000 14.036103 1.330518 14.424378 1.355040 14.724522 c +1.378929 15.016902 1.422241 15.166615 1.475507 15.271155 c +1.603498 15.522351 1.807727 15.726581 2.058923 15.854571 c +2.163463 15.907838 2.313176 15.951150 2.605556 15.975038 c +2.905699 15.999560 3.293974 16.000078 3.865000 16.000078 c +15.465000 16.000078 l +16.036026 16.000078 16.424301 15.999560 16.724445 15.975038 c +17.016823 15.951150 17.166538 15.907838 17.271076 15.854571 c +17.522274 15.726581 17.726501 15.522351 17.854492 15.271155 c +17.907761 15.166615 17.951073 15.016902 17.974960 14.724522 c +17.999481 14.424378 18.000000 14.036104 18.000000 13.465078 c +18.000000 7.865078 l +18.000000 7.294053 17.999481 6.905778 17.974960 6.605635 c +17.951073 6.313254 17.907761 6.163542 17.854492 6.059001 c +17.726501 5.807804 17.522274 5.603576 17.271076 5.475584 c +17.166538 5.422318 17.016823 5.379006 16.724445 5.355118 c +16.424301 5.330595 16.036026 5.330078 15.465000 5.330078 c +14.665000 5.330078 l +14.297730 5.330078 14.000000 5.032348 14.000000 4.665078 c +14.000000 4.297809 14.297730 4.000078 14.665000 4.000078 c +15.465000 4.000078 l +15.492459 4.000078 l +15.492488 4.000078 l +16.029179 4.000070 16.472023 4.000063 16.832748 4.029535 c +17.207378 4.060143 17.551601 4.125825 17.874886 4.290545 c +18.376335 4.546048 18.784031 4.953741 19.039532 5.455194 c +19.204254 5.778477 19.269936 6.122702 19.300545 6.497330 c +19.330015 6.858045 19.330009 7.300875 19.330002 7.837547 c +19.330002 7.837619 l +19.330002 7.865078 l +19.330002 13.465078 l +19.330002 13.492537 l +19.330002 13.492610 l +19.330009 14.029282 19.330015 14.472111 19.300545 14.832827 c +19.269936 15.207455 19.204254 15.551680 19.039532 15.874963 c +18.784031 16.376415 18.376335 16.784107 17.874886 17.039610 c +17.551601 17.204330 17.207378 17.270012 16.832748 17.300621 c +16.472019 17.330093 16.029171 17.330086 15.492474 17.330078 c +15.465000 17.330078 l +3.865000 17.330078 l +h +9.549997 5.417668 m +9.624264 5.444814 9.705738 5.444814 9.780005 5.417668 c +9.779352 5.417907 9.779119 5.418036 9.779340 5.417960 c +9.779449 5.417922 9.779672 5.417834 9.780010 5.417685 c +9.785703 5.415166 9.824282 5.395164 9.915651 5.303084 c +10.027624 5.190243 10.164604 5.026791 10.383287 4.764371 c +11.967221 2.863649 l +12.324518 2.434894 12.562548 2.148232 12.716402 1.925475 c +12.838650 1.748481 12.861221 1.674737 12.864748 1.663215 c +12.864949 1.662560 l +12.864219 1.564913 12.820898 1.472416 12.746351 1.409344 c +12.745722 1.409081 l +12.734627 1.404418 12.663531 1.374542 12.449274 1.355145 c +12.179653 1.330734 11.807049 1.330078 11.248934 1.330078 c +8.081068 1.330078 l +7.522953 1.330078 7.150349 1.330734 6.880728 1.355145 c +6.666473 1.374543 6.595378 1.404416 6.584280 1.409080 c +6.583652 1.409343 l +6.509105 1.472416 6.465783 1.564913 6.465053 1.662560 c +6.465254 1.663213 l +6.468780 1.674733 6.491349 1.748475 6.613600 1.925474 c +6.767454 2.148230 7.005483 2.434893 7.362779 2.863647 c +8.946714 4.764370 l +9.165398 5.026790 9.302377 5.190243 9.414351 5.303084 c +9.505718 5.395163 9.544298 5.415166 9.549992 5.417685 c +9.551012 5.418137 9.550975 5.418026 9.549997 5.417668 c +h +10.236588 6.666842 m +9.867472 6.801756 9.462530 6.801756 9.093414 6.666842 c +8.834289 6.572128 8.636753 6.407670 8.470269 6.239893 c +8.312561 6.080961 8.138463 5.872022 7.942029 5.636275 c +7.924980 5.615815 l +6.341045 3.715093 l +6.320368 3.690281 l +5.989172 3.292866 5.711553 2.959741 5.519254 2.681324 c +5.330824 2.408508 5.141049 2.075929 5.135232 1.690181 c +5.127517 1.178505 5.355523 0.691704 5.753542 0.370064 c +6.053606 0.127583 6.430592 0.060459 6.760806 0.030563 c +7.097775 0.000055 7.531381 0.000065 8.048665 0.000076 c +8.048759 0.000076 l +8.081068 0.000076 l +11.248934 0.000076 l +11.281242 0.000076 l +11.281337 0.000076 l +11.798622 0.000065 12.232226 0.000055 12.569197 0.030563 c +12.899410 0.060459 13.276397 0.127583 13.576460 0.370064 c +13.974480 0.691704 14.202486 1.178505 14.194770 1.690181 c +14.188953 2.075929 13.999178 2.408508 13.810747 2.681325 c +13.618445 2.959745 13.340822 3.292877 13.009618 3.690300 c +12.988955 3.715096 l +11.405022 5.615816 l +11.387974 5.636274 l +11.191540 5.872021 11.017441 6.080961 10.859733 6.239894 c +10.693249 6.407670 10.495712 6.572128 10.236588 6.666842 c +h +f* +n +Q + +endstream +endobj + +3 0 obj + 5505 +endobj + +4 0 obj + << /Annots [] + /Type /Page + /MediaBox [ 0.000000 0.000000 24.000000 24.000000 ] + /Resources 1 0 R + /Contents 2 0 R + /Parent 5 0 R + >> +endobj + +5 0 obj + << /Kids [ 4 0 R ] + /Count 1 + /Type /Pages + >> +endobj + +6 0 obj + << /Pages 5 0 R + /Type /Catalog + >> +endobj + +xref +0 7 +0000000000 65535 f +0000000010 00000 n +0000000034 00000 n +0000005595 00000 n +0000005618 00000 n +0000005791 00000 n +0000005865 00000 n +trailer +<< /ID [ (some) (id) ] + /Root 6 0 R + /Size 7 +>> +startxref +5924 +%%EOF \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Media Gallery/AirPlay.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Media Gallery/AirPlay.imageset/Contents.json new file mode 100644 index 0000000000..458cfc4966 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Media Gallery/AirPlay.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "Airplay.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/submodules/TelegramUI/Sources/ChatMessageGiftItemNode.swift b/submodules/TelegramUI/Sources/ChatMessageGiftItemNode.swift index db3f927777..c498faa0cc 100644 --- a/submodules/TelegramUI/Sources/ChatMessageGiftItemNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageGiftItemNode.swift @@ -14,6 +14,8 @@ import UrlEscaping import TelegramStringFormatting import WallpaperBackgroundNode import ReactionSelectionNode +import AnimatedStickerNode +import TelegramAnimatedStickerNode private func attributedServiceMessageString(theme: ChatPresentationThemeData, strings: PresentationStrings, nameDisplayOrder: PresentationPersonNameOrder, dateTimeFormat: PresentationDateTimeFormat, message: Message, accountPeerId: PeerId) -> NSAttributedString? { return universalServiceMessageString(presentationData: (theme.theme, theme.wallpaper), strings: strings, nameDisplayOrder: nameDisplayOrder, dateTimeFormat: dateTimeFormat, message: EngineMessage(message), accountPeerId: accountPeerId, forChatList: false) @@ -29,8 +31,7 @@ class ChatMessageGiftBubbleContentNode: ChatMessageBubbleContentNode { private let mediaBackgroundNode: NavigationBackgroundNode private let titleNode: TextNode private let subtitleNode: TextNode - - private let giftNode: ASImageNode + private let animationNode: AnimatedStickerNode private let buttonNode: HighlightTrackingButtonNode private let buttonStarsNode: PremiumStarsNode @@ -62,10 +63,10 @@ class ChatMessageGiftBubbleContentNode: ChatMessageBubbleContentNode { self.buttonNode = HighlightTrackingButtonNode() self.buttonNode.clipsToBounds = true self.buttonNode.cornerRadius = 17.0 - - self.giftNode = ASImageNode() - self.giftNode.isUserInteractionEnabled = false - self.giftNode.displaysAsynchronously = false + + self.animationNode = DefaultAnimatedStickerNodeImpl() + self.animationNode.setup(source: AnimatedStickerNodeLocalFileSource(name: "Gift"), width: 384, height: 384, playbackMode: .once, mode: .direct(cachePathPrefix: nil)) + self.animationNode.visibility = true self.buttonStarsNode = PremiumStarsNode() @@ -80,7 +81,7 @@ class ChatMessageGiftBubbleContentNode: ChatMessageBubbleContentNode { self.addSubnode(self.mediaBackgroundNode) self.addSubnode(self.titleNode) self.addSubnode(self.subtitleNode) - self.addSubnode(self.giftNode) + self.addSubnode(self.animationNode) self.addSubnode(self.buttonNode) self.buttonNode.addSubnode(self.buttonStarsNode) @@ -128,7 +129,7 @@ class ChatMessageGiftBubbleContentNode: ChatMessageBubbleContentNode { let contentProperties = ChatMessageBubbleContentProperties(hidesSimpleAuthorHeader: true, headerSpacing: 0.0, hidesBackground: .always, forceFullCorners: false, forceAlignment: .center) return (contentProperties, nil, CGFloat.greatestFiniteMagnitude, { constrainedSize, position in - let imageSize = CGSize(width: 220.0, height: 210.0) + let giftSize = CGSize(width: 220.0, height: 240.0) let attributedString = attributedServiceMessageString(theme: item.presentationData.theme, strings: item.presentationData.strings, nameDisplayOrder: item.presentationData.nameDisplayOrder, dateTimeFormat: item.presentationData.dateTimeFormat, message: item.message, accountPeerId: item.context.account.peerId) @@ -139,7 +140,7 @@ class ChatMessageGiftBubbleContentNode: ChatMessageBubbleContentNode { if let action = media as? TelegramMediaAction { switch action.action { case let .giftPremium(_, _, durationValue): - duration = item.presentationData.strings.Notification_PremiumGift_Subtitle(timeIntervalString(strings: item.presentationData.strings, value: durationValue)).string + duration = item.presentationData.strings.Notification_PremiumGift_Subtitle(item.presentationData.strings.Notification_PremiumGift_Months(durationValue)).string default: break } @@ -148,11 +149,11 @@ class ChatMessageGiftBubbleContentNode: ChatMessageBubbleContentNode { let (labelLayout, labelApply) = makeLabelLayout(TextNodeLayoutArguments(attributedString: attributedString, backgroundColor: nil, maximumNumberOfLines: 0, truncationType: .end, constrainedSize: CGSize(width: constrainedSize.width - 32.0, height: CGFloat.greatestFiniteMagnitude), alignment: .center, cutout: nil, insets: UIEdgeInsets())) - let (titleLayout, titleApply) = makeTitleLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: item.presentationData.strings.Notification_PremiumGift_Title, font: Font.semibold(15.0), textColor: primaryTextColor, paragraphAlignment: .center), backgroundColor: nil, maximumNumberOfLines: 0, truncationType: .end, constrainedSize: CGSize(width: imageSize.width - 32.0, height: CGFloat.greatestFiniteMagnitude), alignment: .center, cutout: nil, insets: UIEdgeInsets())) + let (titleLayout, titleApply) = makeTitleLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: item.presentationData.strings.Notification_PremiumGift_Title, font: Font.semibold(15.0), textColor: primaryTextColor, paragraphAlignment: .center), backgroundColor: nil, maximumNumberOfLines: 0, truncationType: .end, constrainedSize: CGSize(width: giftSize.width - 32.0, height: CGFloat.greatestFiniteMagnitude), alignment: .center, cutout: nil, insets: UIEdgeInsets())) - let (subtitleLayout, subtitleApply) = makeSubtitleLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: duration, font: Font.regular(13.0), textColor: primaryTextColor, paragraphAlignment: .center), backgroundColor: nil, maximumNumberOfLines: 0, truncationType: .end, constrainedSize: CGSize(width: imageSize.width - 32.0, height: CGFloat.greatestFiniteMagnitude), alignment: .center, cutout: nil, insets: UIEdgeInsets())) + let (subtitleLayout, subtitleApply) = makeSubtitleLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: duration, font: Font.regular(13.0), textColor: primaryTextColor, paragraphAlignment: .center), backgroundColor: nil, maximumNumberOfLines: 0, truncationType: .end, constrainedSize: CGSize(width: giftSize.width - 32.0, height: CGFloat.greatestFiniteMagnitude), alignment: .center, cutout: nil, insets: UIEdgeInsets())) - let (buttonTitleLayout, buttonTitleApply) = makeButtonTitleLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: item.presentationData.strings.Notification_PremiumGift_View, font: Font.semibold(15.0), textColor: primaryTextColor, paragraphAlignment: .center), backgroundColor: nil, maximumNumberOfLines: 0, truncationType: .end, constrainedSize: CGSize(width: imageSize.width - 32.0, height: CGFloat.greatestFiniteMagnitude), alignment: .center, cutout: nil, insets: UIEdgeInsets())) + let (buttonTitleLayout, buttonTitleApply) = makeButtonTitleLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: item.presentationData.strings.Notification_PremiumGift_View, font: Font.semibold(15.0), textColor: primaryTextColor, paragraphAlignment: .center), backgroundColor: nil, maximumNumberOfLines: 0, truncationType: .end, constrainedSize: CGSize(width: giftSize.width - 32.0, height: CGFloat.greatestFiniteMagnitude), alignment: .center, cutout: nil, insets: UIEdgeInsets())) var labelRects = labelLayout.linesRects() if labelRects.count > 1 { @@ -184,7 +185,7 @@ class ChatMessageGiftBubbleContentNode: ChatMessageBubbleContentNode { backgroundMaskUpdated = true } - let backgroundSize = CGSize(width: labelLayout.size.width + 8.0 + 8.0, height: labelLayout.size.height + imageSize.height + 18.0) + let backgroundSize = CGSize(width: labelLayout.size.width + 8.0 + 8.0, height: labelLayout.size.height + giftSize.height + 18.0) return (backgroundSize.width, { boundingWidth in return (backgroundSize, { [weak self] animation, synchronousLoads, _ in @@ -193,7 +194,7 @@ class ChatMessageGiftBubbleContentNode: ChatMessageBubbleContentNode { strongSelf.backgroundColorNode.backgroundColor = selectDateFillStaticColor(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper) - let imageFrame = CGRect(origin: CGPoint(x: floorToScreenPixels((backgroundSize.width - imageSize.width) / 2.0), y: labelLayout.size.height + 16.0), size: imageSize) + let imageFrame = CGRect(origin: CGPoint(x: floorToScreenPixels((backgroundSize.width - giftSize.width) / 2.0), y: labelLayout.size.height + 16.0), size: giftSize) let mediaBackgroundFrame = imageFrame.insetBy(dx: -2.0, dy: -2.0) strongSelf.mediaBackgroundNode.frame = mediaBackgroundFrame @@ -201,10 +202,9 @@ class ChatMessageGiftBubbleContentNode: ChatMessageBubbleContentNode { strongSelf.mediaBackgroundNode.update(size: mediaBackgroundFrame.size, transition: .immediate) strongSelf.buttonNode.backgroundColor = item.presentationData.theme.theme.overallDarkAppearance ? UIColor(rgb: 0xffffff, alpha: 0.12) : UIColor(rgb: 0x000000, alpha: 0.12) - strongSelf.giftNode.image = UIImage(bundleImageName: "Components/Gift") - if let image = strongSelf.giftNode.image { - strongSelf.giftNode.frame = CGRect(origin: CGPoint(x: mediaBackgroundFrame.minX + floorToScreenPixels((mediaBackgroundFrame.width - image.size.width) / 2.0), y: mediaBackgroundFrame.minY + 14.0), size: image.size) - } + let iconSize = CGSize(width: 160.0, height: 160.0) + strongSelf.animationNode.frame = CGRect(origin: CGPoint(x: mediaBackgroundFrame.minX + floorToScreenPixels((mediaBackgroundFrame.width - iconSize.width) / 2.0), y: mediaBackgroundFrame.minY - 16.0), size: iconSize) + strongSelf.animationNode.updateLayout(size: iconSize) let _ = labelApply() let _ = titleApply() @@ -214,7 +214,7 @@ class ChatMessageGiftBubbleContentNode: ChatMessageBubbleContentNode { let labelFrame = CGRect(origin: CGPoint(x: 8.0, y: 2.0), size: labelLayout.size) strongSelf.labelNode.frame = labelFrame - let titleFrame = CGRect(origin: CGPoint(x: mediaBackgroundFrame.minX + floorToScreenPixels((mediaBackgroundFrame.width - titleLayout.size.width) / 2.0) , y: mediaBackgroundFrame.minY + 121.0), size: titleLayout.size) + let titleFrame = CGRect(origin: CGPoint(x: mediaBackgroundFrame.minX + floorToScreenPixels((mediaBackgroundFrame.width - titleLayout.size.width) / 2.0) , y: mediaBackgroundFrame.minY + 151.0), size: titleLayout.size) strongSelf.titleNode.frame = titleFrame let subtitleFrame = CGRect(origin: CGPoint(x: mediaBackgroundFrame.minX + floorToScreenPixels((mediaBackgroundFrame.width - subtitleLayout.size.width) / 2.0) , y: titleFrame.maxY - 1.0), size: subtitleLayout.size) diff --git a/submodules/TelegramUniversalVideoContent/Sources/ExternalVideoPlayer.swift b/submodules/TelegramUniversalVideoContent/Sources/ExternalVideoPlayer.swift new file mode 100644 index 0000000000..eceba5b1dd --- /dev/null +++ b/submodules/TelegramUniversalVideoContent/Sources/ExternalVideoPlayer.swift @@ -0,0 +1,121 @@ +import Foundation +import AVFoundation +import SwiftSignalKit +import UniversalMediaPlayer +import AccountContext +import AVKit + +public class ExternalVideoPlayer: NSObject, AVRoutePickerViewDelegate { + private let context: AccountContext + let content: NativeVideoContent + + let player: AVPlayer? + private var didPlayToEndTimeObserver: NSObjectProtocol? + private var timeObserver: Any? + + private var statusValue = MediaPlayerStatus(generationTimestamp: 0.0, duration: 0.0, dimensions: CGSize(), timestamp: 0.0, baseRate: 1.0, seekId: 0, status: .buffering(initial: true, whilePlaying: false, progress: 0.0, display: true), soundEnabled: true) + private let _status = ValuePromise() + var status: Signal { + return self._status.get() + } + private var seekId: Int = 0 + + private weak var routePickerView: UIView? + + public var isActiveUpdated: (Bool) -> Void = { _ in } + + public init(context: AccountContext, content: NativeVideoContent) { + self.context = context + self.content = content + + if let path = context.account.postbox.mediaBox.completedResourcePath(content.fileReference.media.resource, pathExtension: "mp4") { + let player = AVPlayer(url: URL(fileURLWithPath: path)) + self.player = player + } else { + self.player = nil + } + + super.init() + + self.startObservingForAirPlayStatusChanges() + self.isActiveUpdated(self.player?.isExternalPlaybackActive ?? false) + + if let player = self.player { + self.didPlayToEndTimeObserver = NotificationCenter.default.addObserver(forName: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: player.currentItem, queue: nil, using: { [weak self] notification in + if let strongSelf = self { + strongSelf.player?.seek(to: CMTime(seconds: 0.0, preferredTimescale: 30)) + strongSelf.play() + } + }) + + self.timeObserver = player.addPeriodicTimeObserver(forInterval: CMTimeMake(value: 1, timescale: 10), queue: DispatchQueue.main) { [weak self] time in + guard let strongSelf = self else { + return + } + strongSelf.statusValue = MediaPlayerStatus(generationTimestamp: 0.0, duration: strongSelf.statusValue.duration, dimensions: CGSize(), timestamp: CMTimeGetSeconds(time), baseRate: 1.0, seekId: strongSelf.seekId, status: strongSelf.statusValue.status, soundEnabled: true) + strongSelf._status.set(strongSelf.statusValue) + } + } + + self._status.set(self.statusValue) + } + + deinit { + if let timeObserver = self.timeObserver { + self.player?.removeTimeObserver(timeObserver) + } + + if let didPlayToEndTimeObserver = self.didPlayToEndTimeObserver { + NotificationCenter.default.removeObserver(didPlayToEndTimeObserver) + } + + self.stopObservingForAirPlayStatusChanges() + } + + public func play() { + self.player?.play() + } + + public func openRouteSelection() { + if #available(iOS 11.0, *) { + let routePickerView = AVRoutePickerView() + routePickerView.delegate = self + if #available(iOS 13.0, *) { + routePickerView.prioritizesVideoDevices = true + } + self.context.sharedContext.mainWindow?.viewController?.view.addSubview(routePickerView) + + if let routePickerButton = routePickerView.subviews.first(where: { $0 is UIButton }) as? UIButton { + routePickerButton.sendActions(for: .touchUpInside) + } + } + } + + @available(iOS 11.0, *) + public func routePickerViewDidEndPresentingRoutes(_ routePickerView: AVRoutePickerView) { + routePickerView.removeFromSuperview() + + self.play() + } + + private var observerContextAirplay = 1 + + func startObservingForAirPlayStatusChanges() + { + self.player?.addObserver(self, forKeyPath: #keyPath(AVPlayer.isExternalPlaybackActive), options: .new, context: &observerContextAirplay) + } + + func stopObservingForAirPlayStatusChanges() + { + self.player?.removeObserver(self, forKeyPath: #keyPath(AVPlayer.isExternalPlaybackActive)) + } + + public override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { + if context == &observerContextAirplay { + self.isActiveUpdated(self.player?.isExternalPlaybackActive ?? false) + } + else { + super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context) + } + } +} diff --git a/submodules/WebUI/Sources/WebAppController.swift b/submodules/WebUI/Sources/WebAppController.swift index dbf561cd29..e75e08da6c 100644 --- a/submodules/WebUI/Sources/WebAppController.swift +++ b/submodules/WebUI/Sources/WebAppController.swift @@ -777,6 +777,10 @@ public final class WebAppController: ViewController, AttachmentContainable { } self.controller?.present(alertController, in: .window(.root)) } + case "web_app_setup_closing_behavior": + if let json = json, let _ = json["need_confirmation"] as? String { + + } default: break } From e27ec389b1f6758ac23bcbfee4aed5a0593a88fa Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Sat, 9 Jul 2022 19:11:24 +0200 Subject: [PATCH 4/8] Various improvements --- .../Resources/{Gift.tgs => Gift1.tgs} | Bin Telegram/Telegram-iOS/Resources/Gift2.tgs | Bin 0 -> 53946 bytes Telegram/Telegram-iOS/Resources/Gift3.tgs | Bin 0 -> 54100 bytes .../Telegram-iOS/en.lproj/Localizable.strings | 3 ++ .../Sources/AttachmentContainer.swift | 13 +++++++++ .../Sources/AttachmentController.swift | 22 ++++++++++++++ .../Sources/MediaPickerScreen.swift | 8 ++++++ .../PremiumUI/Sources/PremiumGiftScreen.swift | 18 ++++++------ .../Sources/PremiumIntroScreen.swift | 2 +- .../Sources/ChatMessageGiftItemNode.swift | 21 +++++++++++--- .../WebUI/Sources/WebAppController.swift | 27 ++++++++++++++++-- versions.json | 2 +- 12 files changed, 100 insertions(+), 16 deletions(-) rename Telegram/Telegram-iOS/Resources/{Gift.tgs => Gift1.tgs} (100%) create mode 100644 Telegram/Telegram-iOS/Resources/Gift2.tgs create mode 100644 Telegram/Telegram-iOS/Resources/Gift3.tgs diff --git a/Telegram/Telegram-iOS/Resources/Gift.tgs b/Telegram/Telegram-iOS/Resources/Gift1.tgs similarity index 100% rename from Telegram/Telegram-iOS/Resources/Gift.tgs rename to Telegram/Telegram-iOS/Resources/Gift1.tgs diff --git a/Telegram/Telegram-iOS/Resources/Gift2.tgs b/Telegram/Telegram-iOS/Resources/Gift2.tgs new file mode 100644 index 0000000000000000000000000000000000000000..59d727cdf5185496dcfa031f908bd7c123f96a86 GIT binary patch literal 53946 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

U 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 literal 0 HcmV?d00001 diff --git a/Telegram/Telegram-iOS/Resources/Gift3.tgs b/Telegram/Telegram-iOS/Resources/Gift3.tgs new file mode 100644 index 0000000000000000000000000000000000000000..ba9a105858a44bf2082107022e5db7d6fdb1bbcf GIT binary patch literal 54100 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

hi{{N7ZKQfX{r9_*w3uao93x0H;mH|u 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А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 literal 0 HcmV?d00001 diff --git a/Telegram/Telegram-iOS/en.lproj/Localizable.strings b/Telegram/Telegram-iOS/en.lproj/Localizable.strings index 3c0613cc7c..39090862be 100644 --- a/Telegram/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram/Telegram-iOS/en.lproj/Localizable.strings @@ -7840,3 +7840,6 @@ Sorry for the inconvenience."; "Gallery.AirPlay" = "AirPlay"; "Gallery.AirPlayPlaceholder" = "This video is playing on the TV using AirPlay"; + +"WebApp.CloseConfirmation" = "Changes that you made may not be saved."; +"WebApp.CloseAnyway" = "Close Anyway"; diff --git a/submodules/AttachmentUI/Sources/AttachmentContainer.swift b/submodules/AttachmentUI/Sources/AttachmentContainer.swift index acb3bd1be9..b4edaed71c 100644 --- a/submodules/AttachmentUI/Sources/AttachmentContainer.swift +++ b/submodules/AttachmentUI/Sources/AttachmentContainer.swift @@ -37,6 +37,8 @@ final class AttachmentContainer: ASDisplayNode, UIGestureRecognizerDelegate { var interactivelyDismissed: (() -> Void)? var controllerRemoved: ((ViewController) -> Void)? + var shouldCancelPanGesture: (() -> Bool)? + var updateModalProgress: ((CGFloat, ContainedViewLayoutTransition) -> Void)? private var isUpdatingState = false @@ -232,6 +234,11 @@ final class AttachmentContainer: ASDisplayNode, UIGestureRecognizerDelegate { } } + if translation > 40.0, let shouldCancelPanGesture = self.shouldCancelPanGesture, shouldCancelPanGesture() { + self.cancelPanGesture() + return + } + var bounds = self.bounds if self.isExpanded { bounds.origin.y = -max(0.0, translation - edgeTopInset) @@ -340,6 +347,12 @@ final class AttachmentContainer: ASDisplayNode, UIGestureRecognizerDelegate { self.isAnimating = true self.update(layout: layout, controllers: controllers, coveredByModalTransition: coveredByModalTransition, transition: .animated(duration: 0.3, curve: .easeInOut), completion: completion) + + var bounds = self.bounds + let previousBounds = bounds + bounds.origin.y = 0.0 + self.bounds = bounds + self.layer.animateBounds(from: previousBounds, to: self.bounds, duration: 0.3, timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue) default: break } diff --git a/submodules/AttachmentUI/Sources/AttachmentController.swift b/submodules/AttachmentUI/Sources/AttachmentController.swift index bae497be0b..0d792e7619 100644 --- a/submodules/AttachmentUI/Sources/AttachmentController.swift +++ b/submodules/AttachmentUI/Sources/AttachmentController.swift @@ -83,6 +83,7 @@ public protocol AttachmentContainable: ViewController { func prepareForReuse() func requestDismiss(completion: @escaping () -> Void) + func shouldDismissImmediately() -> Bool } public extension AttachmentContainable { @@ -101,6 +102,10 @@ public extension AttachmentContainable { func requestDismiss(completion: @escaping () -> Void) { completion() } + + func shouldDismissImmediately() -> Bool { + return true + } } public enum AttachmentMediaPickerSendMode { @@ -312,6 +317,23 @@ public class AttachmentController: ViewController { } } + self.container.shouldCancelPanGesture = { [weak self] in + if let strongSelf = self, let currentController = strongSelf.currentControllers.last { + if !currentController.shouldDismissImmediately() { + currentController.requestDismiss { [weak self] in + if let strongSelf = self { + strongSelf.controller?.dismiss(animated: true) + } + } + return true + } else { + return false + } + } else { + return false + } + } + self.panel.selectionChanged = { [weak self] type in if let strongSelf = self { return strongSelf.switchToController(type) diff --git a/submodules/MediaPickerUI/Sources/MediaPickerScreen.swift b/submodules/MediaPickerUI/Sources/MediaPickerScreen.swift index 3206e391f0..50cb36cb20 100644 --- a/submodules/MediaPickerUI/Sources/MediaPickerScreen.swift +++ b/submodules/MediaPickerUI/Sources/MediaPickerScreen.swift @@ -1335,6 +1335,14 @@ public final class MediaPickerScreen: ViewController, AttachmentContainable { } } + public func shouldDismissImmediately() -> Bool { + if let selectionState = self.interaction?.selectionState, selectionState.count() > 0 { + return false + } else { + return true + } + } + @objc private func cancelPressed() { self.dismissAllTooltips() diff --git a/submodules/PremiumUI/Sources/PremiumGiftScreen.swift b/submodules/PremiumUI/Sources/PremiumGiftScreen.swift index a1188dd1ef..370322e728 100644 --- a/submodules/PremiumUI/Sources/PremiumGiftScreen.swift +++ b/submodules/PremiumUI/Sources/PremiumGiftScreen.swift @@ -846,12 +846,14 @@ private final class PremiumGiftScreenComponent: CombinedComponent { } }, completed: { [weak self] in if let strongSelf = self { - let _ = updatePremiumPromoConfigurationOnce(account: strongSelf.context.account).start() - strongSelf.inProgress = false - strongSelf.updateInProgress(false) - - strongSelf.updated(transition: .easeInOut(duration: 0.25)) - strongSelf.completion(duration) + Queue.mainQueue().after(2.0) { + let _ = updatePremiumPromoConfigurationOnce(account: strongSelf.context.account).start() + strongSelf.inProgress = false + strongSelf.updateInProgress(false) + + strongSelf.updated(transition: .easeInOut(duration: 0.25)) + strongSelf.completion(duration) + } } })) } @@ -1265,8 +1267,8 @@ public final class PremiumGiftScreen: ViewControllerComponentContainer { controllers = controllers.filter { !($0 is PeerInfoScreen) && !($0 is PremiumGiftScreen) } navigationController.setViewControllers(controllers, animated: true) - Queue.mainQueue().after(0.1, { - if let topController = navigationController.viewControllers.first { + Queue.mainQueue().after(2.8, { + if let topController = navigationController.viewControllers.last { topController.view.addSubview(ConfettiView(frame: topController.view.bounds)) } }) diff --git a/submodules/PremiumUI/Sources/PremiumIntroScreen.swift b/submodules/PremiumUI/Sources/PremiumIntroScreen.swift index 1d38ee523a..c1d3c54b92 100644 --- a/submodules/PremiumUI/Sources/PremiumIntroScreen.swift +++ b/submodules/PremiumUI/Sources/PremiumIntroScreen.swift @@ -1522,7 +1522,7 @@ private final class PremiumIntroScreenComponent: CombinedComponent { maximumNumberOfLines: 2, lineSpacing: 0.0 ), - availableSize: context.availableSize, + availableSize: CGSize(width: context.availableSize.width - 32.0, height: context.availableSize.width), transition: context.transition ) diff --git a/submodules/TelegramUI/Sources/ChatMessageGiftItemNode.swift b/submodules/TelegramUI/Sources/ChatMessageGiftItemNode.swift index c498faa0cc..9a9abbc3ed 100644 --- a/submodules/TelegramUI/Sources/ChatMessageGiftItemNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageGiftItemNode.swift @@ -65,8 +65,6 @@ class ChatMessageGiftBubbleContentNode: ChatMessageBubbleContentNode { self.buttonNode.cornerRadius = 17.0 self.animationNode = DefaultAnimatedStickerNodeImpl() - self.animationNode.setup(source: AnimatedStickerNodeLocalFileSource(name: "Gift"), width: 384, height: 384, playbackMode: .once, mode: .direct(cachePathPrefix: nil)) - self.animationNode.visibility = true self.buttonStarsNode = PremiumStarsNode() @@ -136,11 +134,22 @@ class ChatMessageGiftBubbleContentNode: ChatMessageBubbleContentNode { let primaryTextColor = serviceMessageColorComponents(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper).primaryText var duration: String = "" + var animationName: String = "" for media in item.message.media { if let action = media as? TelegramMediaAction { switch action.action { - case let .giftPremium(_, _, durationValue): - duration = item.presentationData.strings.Notification_PremiumGift_Subtitle(item.presentationData.strings.Notification_PremiumGift_Months(durationValue)).string + case let .giftPremium(_, _, months): + duration = item.presentationData.strings.Notification_PremiumGift_Subtitle(item.presentationData.strings.Notification_PremiumGift_Months(months)).string + switch months { + case 12: + animationName = "Gift2" + case 6: + animationName = "Gift1" + case 3: + animationName = "Gift3" + default: + animationName = "Gift3" + } default: break } @@ -190,6 +199,10 @@ class ChatMessageGiftBubbleContentNode: ChatMessageBubbleContentNode { return (backgroundSize.width, { boundingWidth in return (backgroundSize, { [weak self] animation, synchronousLoads, _ in if let strongSelf = self { + if strongSelf.item == nil { + strongSelf.animationNode.setup(source: AnimatedStickerNodeLocalFileSource(name: animationName), width: 384, height: 384, playbackMode: .once, mode: .direct(cachePathPrefix: nil)) + strongSelf.animationNode.visibility = true + } strongSelf.item = item strongSelf.backgroundColorNode.backgroundColor = selectDateFillStaticColor(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper) diff --git a/submodules/WebUI/Sources/WebAppController.swift b/submodules/WebUI/Sources/WebAppController.swift index e75e08da6c..24ac6baf41 100644 --- a/submodules/WebUI/Sources/WebAppController.swift +++ b/submodules/WebUI/Sources/WebAppController.swift @@ -778,14 +778,16 @@ public final class WebAppController: ViewController, AttachmentContainable { self.controller?.present(alertController, in: .window(.root)) } case "web_app_setup_closing_behavior": - if let json = json, let _ = json["need_confirmation"] as? String { - + if let json = json, let needConfirmation = json["need_confirmation"] as? Bool { + self.needDismissConfirmation = needConfirmation } default: break } } + fileprivate var needDismissConfirmation = false + private var headerColorKey: String? private func updateHeaderBackgroundColor(transition: ContainedViewLayoutTransition) { let color: UIColor? @@ -1121,6 +1123,27 @@ public final class WebAppController: ViewController, AttachmentContainable { public func prepareForReuse() { self.updateTabBarAlpha(1.0, .immediate) } + + public func requestDismiss(completion: @escaping () -> Void) { + if self.controllerNode.needDismissConfirmation { + let controller = textAlertController(context: self.context, title: nil, text: self.presentationData.strings.WebApp_CloseConfirmation, actions: [TextAlertAction(type: .genericAction, title: self.presentationData.strings.WebApp_CloseAnyway, action: { + completion() + }), TextAlertAction(type: .defaultAction, title: self.presentationData.strings.Common_Cancel, action: { + + })], actionLayout: .vertical) + self.present(controller, in: .window(.root)) + } else { + completion() + } + } + + public func shouldDismissImmediately() -> Bool { + if self.controllerNode.needDismissConfirmation { + return false + } else { + return true + } + } } final class WebAppPickerContext: AttachmentMediaPickerContext { diff --git a/versions.json b/versions.json index 829fc8f525..c202f0582b 100644 --- a/versions.json +++ b/versions.json @@ -1,5 +1,5 @@ { - "app": "8.8.2", + "app": "8.8.3", "bazel": "5.1.0", "xcode": "13.4.1" } From c55a66eba0d49b2a142eec693ec4bb2d304788b8 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Sun, 10 Jul 2022 00:29:02 +0200 Subject: [PATCH 5/8] Various improvements --- .../Components/MediaStreamComponent.swift | 4 +- .../TelegramUI/Sources/ChatController.swift | 8 ++- .../Sources/ChatControllerInteraction.swift | 4 +- .../ChatMessageAnimatedStickerItemNode.swift | 4 +- .../Sources/ChatMessageGiftItemNode.swift | 68 ++++++++++++++++++- .../ChatRecentActionsControllerNode.swift | 2 +- .../Sources/DrawingStickersScreen.swift | 2 +- .../OverlayAudioPlayerControllerNode.swift | 2 +- .../Sources/PeerInfo/PeerInfoScreen.swift | 2 +- .../Sources/SharedAccountContext.swift | 2 +- 10 files changed, 82 insertions(+), 16 deletions(-) diff --git a/submodules/TelegramCallsUI/Sources/Components/MediaStreamComponent.swift b/submodules/TelegramCallsUI/Sources/Components/MediaStreamComponent.swift index e9992927ac..87fc1f206a 100644 --- a/submodules/TelegramCallsUI/Sources/Components/MediaStreamComponent.swift +++ b/submodules/TelegramCallsUI/Sources/Components/MediaStreamComponent.swift @@ -1197,7 +1197,7 @@ public final class MediaStreamComponentController: ViewControllerComponentContai self.view.layer.cornerCurve = .continuous } - self.view.layer.animatePosition(from: CGPoint(x: 353.0, y: 117.0), to: self.view.center, duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring, completion: { [weak self] _ in + self.view.layer.animatePosition(from: CGPoint(x: self.view.frame.width * 0.9, y: 117.0), to: self.view.center, duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring, completion: { [weak self] _ in self?.view.layer.cornerRadius = 0.0 }) self.view.layer.animateScale(from: 0.001, to: 1.0, duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring) @@ -1247,7 +1247,7 @@ public final class MediaStreamComponentController: ViewControllerComponentContai self.view.layer.cornerCurve = .continuous } - self.view.layer.animatePosition(from: self.view.center, to: CGPoint(x: 353.0, y: 117.0), duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring, completion: { _ in + self.view.layer.animatePosition(from: self.view.center, to: CGPoint(x: self.view.frame.width * 0.9, y: 117.0), duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring, completion: { _ in }) self.view.layer.animateScale(from: 1.0, to: 0.001, duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring) } diff --git a/submodules/TelegramUI/Sources/ChatController.swift b/submodules/TelegramUI/Sources/ChatController.swift index a05f8bdb55..6a2b9fa3d9 100644 --- a/submodules/TelegramUI/Sources/ChatController.swift +++ b/submodules/TelegramUI/Sources/ChatController.swift @@ -3139,15 +3139,17 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G self?.displayPsa(type: type, sourceNode: sourceNode, isAutomatic: false) }, displayDiceTooltip: { [weak self] dice in self?.displayDiceTooltip(dice: dice) - }, animateDiceSuccess: { [weak self] onlyHaptic in + }, animateDiceSuccess: { [weak self] haptic, confetti in guard let strongSelf = self else { return } if strongSelf.selectPollOptionFeedback == nil { strongSelf.selectPollOptionFeedback = HapticFeedback() } - strongSelf.selectPollOptionFeedback?.success() - if !onlyHaptic { + if haptic { + strongSelf.selectPollOptionFeedback?.success() + } + if confetti { strongSelf.chatDisplayNode.animateQuizCorrectOptionSelected() } }, displayPremiumStickerTooltip: { [weak self] file, message in diff --git a/submodules/TelegramUI/Sources/ChatControllerInteraction.swift b/submodules/TelegramUI/Sources/ChatControllerInteraction.swift index 6beeb74fd9..36261570fc 100644 --- a/submodules/TelegramUI/Sources/ChatControllerInteraction.swift +++ b/submodules/TelegramUI/Sources/ChatControllerInteraction.swift @@ -122,7 +122,7 @@ public final class ChatControllerInteraction { let displayPollSolution: (TelegramMediaPollResults.Solution, ASDisplayNode) -> Void let displayPsa: (String, ASDisplayNode) -> Void let displayDiceTooltip: (TelegramMediaDice) -> Void - let animateDiceSuccess: (Bool) -> Void + let animateDiceSuccess: (Bool, Bool) -> Void let displayPremiumStickerTooltip: (TelegramMediaFile, Message) -> Void let openPeerContextMenu: (Peer, MessageId?, ASDisplayNode, CGRect, ContextGesture?) -> Void let openMessageReplies: (MessageId, Bool, Bool) -> Void @@ -225,7 +225,7 @@ public final class ChatControllerInteraction { displayPollSolution: @escaping (TelegramMediaPollResults.Solution, ASDisplayNode) -> Void, displayPsa: @escaping (String, ASDisplayNode) -> Void, displayDiceTooltip: @escaping (TelegramMediaDice) -> Void, - animateDiceSuccess: @escaping (Bool) -> Void, + animateDiceSuccess: @escaping (Bool, Bool) -> Void, displayPremiumStickerTooltip: @escaping (TelegramMediaFile, Message) -> Void, openPeerContextMenu: @escaping (Peer, MessageId?, ASDisplayNode, CGRect, ContextGesture?) -> Void, openMessageReplies: @escaping (MessageId, Bool, Bool) -> Void, diff --git a/submodules/TelegramUI/Sources/ChatMessageAnimatedStickerItemNode.swift b/submodules/TelegramUI/Sources/ChatMessageAnimatedStickerItemNode.swift index 240adba31b..efefbb0e54 100644 --- a/submodules/TelegramUI/Sources/ChatMessageAnimatedStickerItemNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageAnimatedStickerItemNode.swift @@ -423,7 +423,7 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { if !item.message.effectivelyIncoming(item.context.account.peerId) { animationNode.success = { [weak self] onlyHaptic in if let strongSelf = self, let item = strongSelf.item { - item.controllerInteraction.animateDiceSuccess(onlyHaptic) + item.controllerInteraction.animateDiceSuccess(true, !onlyHaptic) } } } @@ -433,7 +433,7 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { if !item.message.effectivelyIncoming(item.context.account.peerId) { animationNode.success = { [weak self] in if let strongSelf = self, let item = strongSelf.item { - item.controllerInteraction.animateDiceSuccess(false) + item.controllerInteraction.animateDiceSuccess(true, true) } } } diff --git a/submodules/TelegramUI/Sources/ChatMessageGiftItemNode.swift b/submodules/TelegramUI/Sources/ChatMessageGiftItemNode.swift index 9a9abbc3ed..937e1b1fdc 100644 --- a/submodules/TelegramUI/Sources/ChatMessageGiftItemNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageGiftItemNode.swift @@ -40,6 +40,29 @@ class ChatMessageGiftBubbleContentNode: ChatMessageBubbleContentNode { private var cachedMaskBackgroundImage: (CGPoint, UIImage, [CGRect])? private var absoluteRect: (CGRect, CGSize)? + private var isPlaying: Bool = false + private var wasPending: Bool = false + private var didChangeFromPendingToSent: Bool = false + + override var visibility: ListViewItemNodeVisibility { + didSet { + let wasVisible = oldValue != .none + let isVisible = self.visibility != .none + + if wasVisible != isVisible { + self.visibilityStatus = isVisible + } + } + } + + private var visibilityStatus: Bool? { + didSet { + if self.visibilityStatus != oldValue { + self.updateVisibility() + } + } + } + required init() { self.labelNode = TextNode() self.labelNode.isUserInteractionEnabled = false @@ -200,11 +223,19 @@ class ChatMessageGiftBubbleContentNode: ChatMessageBubbleContentNode { return (backgroundSize, { [weak self] animation, synchronousLoads, _ in if let strongSelf = self { if strongSelf.item == nil { - strongSelf.animationNode.setup(source: AnimatedStickerNodeLocalFileSource(name: animationName), width: 384, height: 384, playbackMode: .once, mode: .direct(cachePathPrefix: nil)) - strongSelf.animationNode.visibility = true + strongSelf.animationNode.autoplay = true + strongSelf.animationNode.setup(source: AnimatedStickerNodeLocalFileSource(name: animationName), width: 384, height: 384, playbackMode: .still(.end), mode: .direct(cachePathPrefix: nil)) } strongSelf.item = item + if item.message.id.namespace == Namespaces.Message.Local || item.message.id.namespace == Namespaces.Message.ScheduledLocal { + strongSelf.wasPending = true + } + if strongSelf.wasPending && (item.message.id.namespace != Namespaces.Message.Local && item.message.id.namespace != Namespaces.Message.ScheduledLocal) { + strongSelf.didChangeFromPendingToSent = true + } + strongSelf.updateVisibility() + strongSelf.backgroundColorNode.backgroundColor = selectDateFillStaticColor(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper) let imageFrame = CGRect(origin: CGPoint(x: floorToScreenPixels((backgroundSize.width - giftSize.width) / 2.0), y: labelLayout.size.height + 16.0), size: giftSize) @@ -384,4 +415,37 @@ class ChatMessageGiftBubbleContentNode: ChatMessageBubbleContentNode { return .none } } + + private func updateVisibility() { + guard let item = self.item else { + return + } + + let isPlaying = self.visibilityStatus == true + if self.isPlaying != isPlaying { + self.isPlaying = isPlaying + self.animationNode.visibility = isPlaying + } + + if isPlaying { + var alreadySeen = true + + if let unreadRange = item.controllerInteraction.unreadMessageRange[UnreadMessageRangeKey(peerId: item.message.id.peerId, namespace: item.message.id.namespace)] { + if unreadRange.contains(item.message.id.id) { + if !item.controllerInteraction.seenOneTimeAnimatedMedia.contains(item.message.id) { + alreadySeen = false + } + } + } + + if !item.controllerInteraction.seenOneTimeAnimatedMedia.contains(item.message.id) { + item.controllerInteraction.seenOneTimeAnimatedMedia.insert(item.message.id) + self.animationNode.playOnce() + } + + if !alreadySeen { + item.controllerInteraction.animateDiceSuccess(false, true) + } + } + } } diff --git a/submodules/TelegramUI/Sources/ChatRecentActionsControllerNode.swift b/submodules/TelegramUI/Sources/ChatRecentActionsControllerNode.swift index 936cb29704..a81534c233 100644 --- a/submodules/TelegramUI/Sources/ChatRecentActionsControllerNode.swift +++ b/submodules/TelegramUI/Sources/ChatRecentActionsControllerNode.swift @@ -517,7 +517,7 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode { }, displayPollSolution: { _, _ in }, displayPsa: { _, _ in }, displayDiceTooltip: { _ in - }, animateDiceSuccess: { _ in + }, animateDiceSuccess: { _, _ in }, displayPremiumStickerTooltip: { _, _ in }, openPeerContextMenu: { _, _, _, _, _ in }, openMessageReplies: { _, _, _ in diff --git a/submodules/TelegramUI/Sources/DrawingStickersScreen.swift b/submodules/TelegramUI/Sources/DrawingStickersScreen.swift index 13daf942a7..0e8743ef92 100644 --- a/submodules/TelegramUI/Sources/DrawingStickersScreen.swift +++ b/submodules/TelegramUI/Sources/DrawingStickersScreen.swift @@ -143,7 +143,7 @@ private final class DrawingStickersScreenNode: ViewControllerTracingNode { }, displayPollSolution: { _, _ in }, displayPsa: { _, _ in }, displayDiceTooltip: { _ in - }, animateDiceSuccess: { _ in + }, animateDiceSuccess: { _, _ in }, displayPremiumStickerTooltip: { _, _ in }, openPeerContextMenu: { _, _, _, _, _ in }, openMessageReplies: { _, _, _ in diff --git a/submodules/TelegramUI/Sources/OverlayAudioPlayerControllerNode.swift b/submodules/TelegramUI/Sources/OverlayAudioPlayerControllerNode.swift index 5c6dd1e3b0..7918d25600 100644 --- a/submodules/TelegramUI/Sources/OverlayAudioPlayerControllerNode.swift +++ b/submodules/TelegramUI/Sources/OverlayAudioPlayerControllerNode.swift @@ -135,7 +135,7 @@ final class OverlayAudioPlayerControllerNode: ViewControllerTracingNode, UIGestu }, displayPollSolution: { _, _ in }, displayPsa: { _, _ in }, displayDiceTooltip: { _ in - }, animateDiceSuccess: { _ in + }, animateDiceSuccess: { _, _ in }, displayPremiumStickerTooltip: { _, _ in }, openPeerContextMenu: { _, _, _, _, _ in }, openMessageReplies: { _, _, _ in diff --git a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift index 8dc1c40b17..94ba363f8b 100644 --- a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift +++ b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift @@ -2336,7 +2336,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate }, displayPollSolution: { _, _ in }, displayPsa: { _, _ in }, displayDiceTooltip: { _ in - }, animateDiceSuccess: { _ in + }, animateDiceSuccess: { _, _ in }, displayPremiumStickerTooltip: { _, _ in }, openPeerContextMenu: { _, _, _, _, _ in }, openMessageReplies: { _, _, _ in diff --git a/submodules/TelegramUI/Sources/SharedAccountContext.swift b/submodules/TelegramUI/Sources/SharedAccountContext.swift index 7f8e089a21..1d07912800 100644 --- a/submodules/TelegramUI/Sources/SharedAccountContext.swift +++ b/submodules/TelegramUI/Sources/SharedAccountContext.swift @@ -1313,7 +1313,7 @@ public final class SharedAccountContextImpl: SharedAccountContext { }, displayPollSolution: { _, _ in }, displayPsa: { _, _ in }, displayDiceTooltip: { _ in - }, animateDiceSuccess: { _ in + }, animateDiceSuccess: { _, _ in }, displayPremiumStickerTooltip: { _, _ in }, openPeerContextMenu: { _, _, _, _, _ in }, openMessageReplies: { _, _, _ in From 028f9ff731bea4789101d65af1e873001609ff98 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Sun, 10 Jul 2022 11:04:10 +0200 Subject: [PATCH 6/8] Various fixes --- .../Sources/AttachmentContainer.swift | 2 +- .../WebUI/Sources/WebAppController.swift | 29 ++++++++++++++----- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/submodules/AttachmentUI/Sources/AttachmentContainer.swift b/submodules/AttachmentUI/Sources/AttachmentContainer.swift index b4edaed71c..7ea7aecff3 100644 --- a/submodules/AttachmentUI/Sources/AttachmentContainer.swift +++ b/submodules/AttachmentUI/Sources/AttachmentContainer.swift @@ -234,7 +234,7 @@ final class AttachmentContainer: ASDisplayNode, UIGestureRecognizerDelegate { } } - if translation > 40.0, let shouldCancelPanGesture = self.shouldCancelPanGesture, shouldCancelPanGesture() { + if !self.isExpanded, translation > 40.0, let shouldCancelPanGesture = self.shouldCancelPanGesture, shouldCancelPanGesture() { self.cancelPanGesture() return } diff --git a/submodules/WebUI/Sources/WebAppController.swift b/submodules/WebUI/Sources/WebAppController.swift index 24ac6baf41..f51919647f 100644 --- a/submodules/WebUI/Sources/WebAppController.swift +++ b/submodules/WebUI/Sources/WebAppController.swift @@ -898,7 +898,7 @@ public final class WebAppController: ViewController, AttachmentContainable { fileprivate func sendAlertButtonEvent(id: String?) { var paramsString: String? if let id = id { - paramsString = "{id: \"\(id)\"}" + paramsString = "{button_id: \"\(id)\"}" } self.webView?.sendEvent(name: "popup_closed", data: paramsString) } @@ -1013,7 +1013,9 @@ public final class WebAppController: ViewController, AttachmentContainable { if case .back = self.cancelButtonNode.state { self.controllerNode.sendBackButtonEvent() } else { - self.dismiss() + self.requestDismiss { + self.dismiss() + } } } @@ -1126,12 +1128,23 @@ public final class WebAppController: ViewController, AttachmentContainable { public func requestDismiss(completion: @escaping () -> Void) { if self.controllerNode.needDismissConfirmation { - let controller = textAlertController(context: self.context, title: nil, text: self.presentationData.strings.WebApp_CloseConfirmation, actions: [TextAlertAction(type: .genericAction, title: self.presentationData.strings.WebApp_CloseAnyway, action: { - completion() - }), TextAlertAction(type: .defaultAction, title: self.presentationData.strings.Common_Cancel, action: { - - })], actionLayout: .vertical) - self.present(controller, in: .window(.root)) + let actionSheet = ActionSheetController(presentationData: self.presentationData) + actionSheet.setItemGroups([ + ActionSheetItemGroup(items: [ + ActionSheetTextItem(title: self.presentationData.strings.WebApp_CloseConfirmation), + ActionSheetButtonItem(title: self.presentationData.strings.WebApp_CloseAnyway, color: .destructive, action: { [weak actionSheet] in + actionSheet?.dismissAnimated() + + completion() + }) + ]), + ActionSheetItemGroup(items: [ + ActionSheetButtonItem(title: self.presentationData.strings.Common_Cancel, color: .accent, font: .bold, action: { [weak actionSheet] in + actionSheet?.dismissAnimated() + }) + ]) + ]) + self.present(actionSheet, in: .window(.root)) } else { completion() } From fc609c6c7076d16bd859204a89064a14f28fdcd3 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Sun, 10 Jul 2022 12:54:01 +0200 Subject: [PATCH 7/8] Various fixes --- .../SyncCore/SyncCore_Namespaces.swift | 2 +- .../Sources/NavigateToChatController.swift | 19 +++++++++++-------- .../Sources/UndoOverlayControllerNode.swift | 8 ++++---- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/submodules/TelegramCore/Sources/SyncCore/SyncCore_Namespaces.swift b/submodules/TelegramCore/Sources/SyncCore/SyncCore_Namespaces.swift index db298b43d9..acd5448e77 100644 --- a/submodules/TelegramCore/Sources/SyncCore/SyncCore_Namespaces.swift +++ b/submodules/TelegramCore/Sources/SyncCore/SyncCore_Namespaces.swift @@ -39,7 +39,7 @@ public struct Namespaces { } public struct ItemCollection { - public static let CloudStickerPacks: Int32 = 7 + public static let CloudStickerPacks: Int32 = 0 public static let CloudMaskPacks: Int32 = 1 public static let EmojiKeywords: Int32 = 2 public static let CloudAnimatedEmoji: Int32 = 3 diff --git a/submodules/TelegramUI/Sources/NavigateToChatController.swift b/submodules/TelegramUI/Sources/NavigateToChatController.swift index 4154be2ba1..826f00f043 100644 --- a/submodules/TelegramUI/Sources/NavigateToChatController.swift +++ b/submodules/TelegramUI/Sources/NavigateToChatController.swift @@ -11,6 +11,7 @@ import ChatListUI import PeerAvatarGalleryUI import SettingsUI import ChatPresentationInterfaceState +import AttachmentUI public func navigateToChatControllerImpl(_ params: NavigateToChatControllerParams) { var found = false @@ -21,6 +22,7 @@ public func navigateToChatControllerImpl(_ params: NavigateToChatControllerParam if let updateTextInputState = params.updateTextInputState { controller.updateTextInputState(updateTextInputState) } + var popAndComplete = true if let subject = params.subject, case let .message(messageSubject, _, timecode) = subject { if case let .id(messageId) = messageSubject { let navigationController = params.navigationController @@ -33,20 +35,21 @@ public func navigateToChatControllerImpl(_ params: NavigateToChatControllerParam (navigationController?.viewControllers.last as? ViewController)?.present(c, in: .window(.root), with: a) }) } + popAndComplete = false } else if params.scrollToEndIfExists && isFirst { controller.scrollToEndOfHistory() - let _ = params.navigationController.popToViewController(controller, animated: params.animated) - params.completion(controller) } else if let search = params.activateMessageSearch { controller.activateSearch(domain: search.0, query: search.1) - let _ = params.navigationController.popToViewController(controller, animated: params.animated) - params.completion(controller) } else if let reportReason = params.reportReason { controller.beginReportSelection(reason: reportReason) - let _ = params.navigationController.popToViewController(controller, animated: params.animated) - params.completion(controller) - } else { - let _ = params.navigationController.popToViewController(controller, animated: params.animated) + } + + if popAndComplete { + if let _ = params.navigationController.viewControllers.last as? AttachmentController, let controller = params.navigationController.viewControllers[params.navigationController.viewControllers.count - 2] as? ChatControllerImpl, controller.chatLocation == params.chatLocation { + + } else { + let _ = params.navigationController.popToViewController(controller, animated: params.animated) + } params.completion(controller) } controller.purposefulAction = params.purposefulAction diff --git a/submodules/UndoUI/Sources/UndoOverlayControllerNode.swift b/submodules/UndoUI/Sources/UndoOverlayControllerNode.swift index d0bb24e117..9f9cbbb987 100644 --- a/submodules/UndoUI/Sources/UndoOverlayControllerNode.swift +++ b/submodules/UndoUI/Sources/UndoOverlayControllerNode.swift @@ -880,17 +880,17 @@ final class UndoOverlayControllerNode: ViewControllerTracingNode { case .removedChat: self.panelWrapperNode.addSubnode(self.timerTextNode) case .archivedChat, .hidArchive, .revealedArchive, .autoDelete, .succeed, .emoji, .swipeToReply, .actionSucceeded, .stickersModified, .chatAddedToFolder, .chatRemovedFromFolder, .messagesUnpinned, .setProximityAlert, .invitedToVoiceChat, .linkCopied, .banned, .importedMessage, .audioRate, .forward, .gigagroupConversion, .linkRevoked, .voiceChatRecording, .voiceChatFlag, .voiceChatCanSpeak, .copy, .mediaSaved, .paymentSent, .image, .inviteRequestSent, .notificationSoundAdded, .universal: - if self.textNode.tapAttributeAction != nil { + if self.textNode.tapAttributeAction != nil || displayUndo { self.isUserInteractionEnabled = true } else { self.isUserInteractionEnabled = false } - case let .sticker(_, _, _, _, undoText): - self.isUserInteractionEnabled = undoText != nil + case .sticker: + self.isUserInteractionEnabled = displayUndo case .dice: self.panelWrapperNode.clipsToBounds = true case .info: - if self.textNode.tapAttributeAction != nil { + if self.textNode.tapAttributeAction != nil || displayUndo { self.isUserInteractionEnabled = true } else { self.isUserInteractionEnabled = false From aa46e81a4928a22f58e9b6240b31104c01767c0a Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Sun, 10 Jul 2022 20:35:05 +0200 Subject: [PATCH 8/8] Various fixes --- .../Sources/AttachmentContainer.swift | 9 +- .../Sources/AttachmentController.swift | 15 +- .../Sources/GiftAvatarComponent.swift | 10 +- .../PremiumUI/Sources/PremiumGiftScreen.swift | 222 ++++++++---------- .../Sources/ShareControllerNode.swift | 22 +- 5 files changed, 140 insertions(+), 138 deletions(-) diff --git a/submodules/AttachmentUI/Sources/AttachmentContainer.swift b/submodules/AttachmentUI/Sources/AttachmentContainer.swift index 7ea7aecff3..bf75ed7100 100644 --- a/submodules/AttachmentUI/Sources/AttachmentContainer.swift +++ b/submodules/AttachmentUI/Sources/AttachmentContainer.swift @@ -38,6 +38,7 @@ final class AttachmentContainer: ASDisplayNode, UIGestureRecognizerDelegate { var controllerRemoved: ((ViewController) -> Void)? var shouldCancelPanGesture: (() -> Bool)? + var requestDismiss: (() -> Void)? var updateModalProgress: ((CGFloat, ContainedViewLayoutTransition) -> Void)? @@ -236,6 +237,7 @@ final class AttachmentContainer: ASDisplayNode, UIGestureRecognizerDelegate { if !self.isExpanded, translation > 40.0, let shouldCancelPanGesture = self.shouldCancelPanGesture, shouldCancelPanGesture() { self.cancelPanGesture() + self.requestDismiss?() return } @@ -284,8 +286,13 @@ final class AttachmentContainer: ASDisplayNode, UIGestureRecognizerDelegate { let offset = currentTopInset + panOffset let topInset: CGFloat = edgeTopInset + var ignoreDismiss = false + if let shouldCancelPanGesture = self.shouldCancelPanGesture, shouldCancelPanGesture() { + ignoreDismiss = true + } + var dismissing = false - if bounds.minY < -60 || (bounds.minY < 0.0 && velocity.y > 300.0) || (self.isExpanded && bounds.minY.isZero && velocity.y > 1800.0) { + if (bounds.minY < -60 || (bounds.minY < 0.0 && velocity.y > 300.0) || (self.isExpanded && bounds.minY.isZero && velocity.y > 1800.0)) && !ignoreDismiss { self.interactivelyDismissed?() dismissing = true } else if self.isExpanded { diff --git a/submodules/AttachmentUI/Sources/AttachmentController.swift b/submodules/AttachmentUI/Sources/AttachmentController.swift index 0d792e7619..e8bfdf2ad8 100644 --- a/submodules/AttachmentUI/Sources/AttachmentController.swift +++ b/submodules/AttachmentUI/Sources/AttachmentController.swift @@ -320,11 +320,6 @@ public class AttachmentController: ViewController { self.container.shouldCancelPanGesture = { [weak self] in if let strongSelf = self, let currentController = strongSelf.currentControllers.last { if !currentController.shouldDismissImmediately() { - currentController.requestDismiss { [weak self] in - if let strongSelf = self { - strongSelf.controller?.dismiss(animated: true) - } - } return true } else { return false @@ -334,6 +329,16 @@ public class AttachmentController: ViewController { } } + self.container.requestDismiss = { [weak self] in + if let strongSelf = self, let currentController = strongSelf.currentControllers.last { + currentController.requestDismiss { [weak self] in + if let strongSelf = self { + strongSelf.controller?.dismiss(animated: true) + } + } + } + } + self.panel.selectionChanged = { [weak self] type in if let strongSelf = self { return strongSelf.switchToController(type) diff --git a/submodules/PremiumUI/Sources/GiftAvatarComponent.swift b/submodules/PremiumUI/Sources/GiftAvatarComponent.swift index f5fe398dd5..668a2e6a1f 100644 --- a/submodules/PremiumUI/Sources/GiftAvatarComponent.swift +++ b/submodules/PremiumUI/Sources/GiftAvatarComponent.swift @@ -50,11 +50,11 @@ private func generateDiffuseTexture() -> UIImage { class GiftAvatarComponent: Component { let context: AccountContext - let peer: EnginePeer + let peer: EnginePeer? let isVisible: Bool let hasIdleAnimations: Bool - init(context: AccountContext, peer: EnginePeer, isVisible: Bool, hasIdleAnimations: Bool) { + init(context: AccountContext, peer: EnginePeer?, isVisible: Bool, hasIdleAnimations: Bool) { self.context = context self.peer = peer self.isVisible = isVisible @@ -62,7 +62,7 @@ class GiftAvatarComponent: Component { } static func ==(lhs: GiftAvatarComponent, rhs: GiftAvatarComponent) -> Bool { - return lhs.isVisible == rhs.isVisible && lhs.hasIdleAnimations == rhs.hasIdleAnimations + return lhs.peer == rhs.peer && lhs.isVisible == rhs.isVisible && lhs.hasIdleAnimations == rhs.hasIdleAnimations } final class View: UIView, SCNSceneRendererDelegate, ComponentTaggedView { @@ -276,7 +276,9 @@ class GiftAvatarComponent: Component { self.hasIdleAnimations = component.hasIdleAnimations let avatarSize = CGSize(width: 100.0, height: 100.0) - self.avatarNode.setSignal(peerAvatarCompleteImage(account: component.context.account, peer: component.peer, size: avatarSize, font: avatarPlaceholderFont(size: 43.0), fullSize: true)) + if let peer = component.peer { + self.avatarNode.setSignal(peerAvatarCompleteImage(account: component.context.account, peer: peer, size: avatarSize, font: avatarPlaceholderFont(size: 43.0), fullSize: true)) + } self.avatarNode.frame = CGRect(origin: CGPoint(x: floorToScreenPixels((availableSize.width - avatarSize.width) / 2.0), y: 63.0), size: avatarSize) return availableSize diff --git a/submodules/PremiumUI/Sources/PremiumGiftScreen.swift b/submodules/PremiumUI/Sources/PremiumGiftScreen.swift index 370322e728..6fef507b35 100644 --- a/submodules/PremiumUI/Sources/PremiumGiftScreen.swift +++ b/submodules/PremiumUI/Sources/PremiumGiftScreen.swift @@ -500,14 +500,14 @@ private final class PremiumGiftScreenContentComponent: CombinedComponent { typealias EnvironmentType = (ViewControllerComponentContainer.Environment, ScrollChildEnvironment) let context: AccountContext - let peer: EnginePeer - let products: [InAppPurchaseManager.Product] - let selectedProductId: String + let peer: EnginePeer? + let products: [InAppPurchaseManager.Product]? + let selectedProductId: String? let present: (ViewController) -> Void let selectProduct: (String) -> Void - init(context: AccountContext, peer: EnginePeer, products: [InAppPurchaseManager.Product], selectedProductId: String, present: @escaping (ViewController) -> Void, selectProduct: @escaping (String) -> Void) { + init(context: AccountContext, peer: EnginePeer?, products: [InAppPurchaseManager.Product]?, selectedProductId: String?, present: @escaping (ViewController) -> Void, selectProduct: @escaping (String) -> Void) { self.context = context self.peer = peer self.products = products @@ -583,7 +583,6 @@ private final class PremiumGiftScreenContentComponent: CombinedComponent { let textColor = theme.list.itemPrimaryTextColor let subtitleColor = theme.list.itemSecondaryTextColor -// let arrowColor = theme.list.disclosureArrowColor let textFont = Font.regular(15.0) let boldTextFont = Font.semibold(15.0) @@ -594,7 +593,7 @@ private final class PremiumGiftScreenContentComponent: CombinedComponent { let text = text.update( component: MultilineTextComponent( text: .markdown( - text: strings.Premium_Gift_Description(component.peer.compactDisplayTitle).string, + text: strings.Premium_Gift_Description(component.peer?.compactDisplayTitle ?? "").string, attributes: markdownAttributes ), horizontalAlignment: .center, @@ -620,52 +619,54 @@ private final class PremiumGiftScreenContentComponent: CombinedComponent { ] var i = 0 - for product in component.products { - let monthsCount: Int - let giftTitle: String - let discount: String - switch product.id { - case "org.telegram.telegramPremium.twelveMonths": - giftTitle = strings.Premium_Gift_Years(1) - monthsCount = 12 - discount = "-15%" - case "org.telegram.telegramPremium.sixMonths": - giftTitle = strings.Premium_Gift_Months(6) - monthsCount = 6 - discount = "-10%" - case "org.telegram.telegramPremium.threeMonths": - giftTitle = strings.Premium_Gift_Months(3) - monthsCount = 3 - discount = "-7%" - default: - giftTitle = "" - monthsCount = 1 - discount = "" - } - - items.append(ProductGroupComponent.Item( - AnyComponentWithIdentity( - id: product.id, - component: AnyComponent( - GiftComponent( - title: giftTitle, - totalPrice: product.price, - perMonthPrice: strings.Premium_Gift_PricePerMonth(product.pricePerMonth(monthsCount)).string, - discount: discount, - selected: product.id == component.selectedProductId, - primaryTextColor: textColor, - secondaryTextColor: subtitleColor, - accentColor: gradientColors[i], - checkForegroundColor: environment.theme.list.itemCheckColors.foregroundColor, - checkBorderColor: environment.theme.list.itemCheckColors.strokeColor + if let products = component.products { + for product in products { + let monthsCount: Int + let giftTitle: String + let discount: String + switch product.id { + case "org.telegram.telegramPremium.twelveMonths": + giftTitle = strings.Premium_Gift_Years(1) + monthsCount = 12 + discount = "-15%" + case "org.telegram.telegramPremium.sixMonths": + giftTitle = strings.Premium_Gift_Months(6) + monthsCount = 6 + discount = "-10%" + case "org.telegram.telegramPremium.threeMonths": + giftTitle = strings.Premium_Gift_Months(3) + monthsCount = 3 + discount = "-7%" + default: + giftTitle = "" + monthsCount = 1 + discount = "" + } + + items.append(ProductGroupComponent.Item( + AnyComponentWithIdentity( + id: product.id, + component: AnyComponent( + GiftComponent( + title: giftTitle, + totalPrice: product.price, + perMonthPrice: strings.Premium_Gift_PricePerMonth(product.pricePerMonth(monthsCount)).string, + discount: discount, + selected: product.id == component.selectedProductId, + primaryTextColor: textColor, + secondaryTextColor: subtitleColor, + accentColor: gradientColors[i], + checkForegroundColor: environment.theme.list.itemCheckColors.foregroundColor, + checkBorderColor: environment.theme.list.itemCheckColors.strokeColor + ) ) - ) - ), - action: { - component.selectProduct(product.id) - }) - ) - i += 1 + ), + action: { + component.selectProduct(product.id) + }) + ) + i += 1 + } } let section = section.update( @@ -960,45 +961,43 @@ private final class PremiumGiftScreenComponent: CombinedComponent { .position(CGPoint(x: context.availableSize.width / 2.0, y: context.availableSize.height / 2.0)) ) - if let peer = state.peer, let products = state.products, let selectedProductId = state.selectedProductId { - let scrollContent = scrollContent.update( - component: ScrollComponent( - content: AnyComponent(PremiumGiftScreenContentComponent( - context: context.component.context, - peer: peer, - products: products, - selectedProductId: selectedProductId, - present: context.component.present, - selectProduct: { [weak state] productId in - state?.selectProduct(id: productId) - } - )), - contentInsets: UIEdgeInsets(top: environment.navigationHeight, left: 0.0, bottom: bottomPanelHeight, right: 0.0), - contentOffsetUpdated: { [weak state] topContentOffset, bottomContentOffset in - state?.topContentOffset = topContentOffset - state?.bottomContentOffset = bottomContentOffset - Queue.mainQueue().justDispatch { - state?.updated(transition: .immediate) - } - }, - contentOffsetWillCommit: { targetContentOffset in - if targetContentOffset.pointee.y < 100.0 { - targetContentOffset.pointee = CGPoint(x: 0.0, y: 0.0) - } else if targetContentOffset.pointee.y < 123.0 { - targetContentOffset.pointee = CGPoint(x: 0.0, y: 123.0) - } + let scrollContent = scrollContent.update( + component: ScrollComponent( + content: AnyComponent(PremiumGiftScreenContentComponent( + context: context.component.context, + peer: state.peer, + products: state.products, + selectedProductId: state.selectedProductId, + present: context.component.present, + selectProduct: { [weak state] productId in + state?.selectProduct(id: productId) } - ), - environment: { environment }, - availableSize: context.availableSize, - transition: context.transition - ) - - context.add(scrollContent - .position(CGPoint(x: context.availableSize.width / 2.0, y: context.availableSize.height / 2.0)) - ) - } - + )), + contentInsets: UIEdgeInsets(top: environment.navigationHeight, left: 0.0, bottom: bottomPanelHeight, right: 0.0), + contentOffsetUpdated: { [weak state] topContentOffset, bottomContentOffset in + state?.topContentOffset = topContentOffset + state?.bottomContentOffset = bottomContentOffset + Queue.mainQueue().justDispatch { + state?.updated(transition: .immediate) + } + }, + contentOffsetWillCommit: { targetContentOffset in + if targetContentOffset.pointee.y < 100.0 { + targetContentOffset.pointee = CGPoint(x: 0.0, y: 0.0) + } else if targetContentOffset.pointee.y < 123.0 { + targetContentOffset.pointee = CGPoint(x: 0.0, y: 123.0) + } + } + ), + environment: { environment }, + availableSize: context.availableSize, + transition: context.transition + ) + + context.add(scrollContent + .position(CGPoint(x: context.availableSize.width / 2.0, y: context.availableSize.height / 2.0)) + ) + let topPanelAlpha: CGFloat let titleOffset: CGFloat let titleScale: CGFloat @@ -1019,23 +1018,21 @@ private final class PremiumGiftScreenComponent: CombinedComponent { titleAlpha = 1.0 } - if let peer = context.state.peer { - let star = star.update( - component: GiftAvatarComponent( - context: context.component.context, - peer: peer, - isVisible: starIsVisible, - hasIdleAnimations: state.hasIdleAnimations - ), - availableSize: CGSize(width: min(390.0, context.availableSize.width), height: 220.0), - transition: context.transition - ) - - context.add(star - .position(CGPoint(x: context.availableSize.width / 2.0, y: topInset + star.size.height / 2.0 - 30.0 - titleOffset * titleScale)) - .scale(titleScale) - ) - } + let star = star.update( + component: GiftAvatarComponent( + context: context.component.context, + peer: context.state.peer, + isVisible: starIsVisible, + hasIdleAnimations: state.hasIdleAnimations + ), + availableSize: CGSize(width: min(390.0, context.availableSize.width), height: 220.0), + transition: context.transition + ) + + context.add(star + .position(CGPoint(x: context.availableSize.width / 2.0, y: topInset + star.size.height / 2.0 - 30.0 - titleOffset * titleScale)) + .scale(titleScale) + ) context.add(topPanel .position(CGPoint(x: context.availableSize.width / 2.0, y: topPanel.size.height / 2.0)) @@ -1251,27 +1248,16 @@ public final class PremiumGiftScreen: ViewControllerComponentContainer { strongSelf.view.disablesInteractiveModalDismiss = inProgress } } - -// presentImpl = { [weak self] c in -// self?.present(c, in: .window(.root)) -// } - + pushImpl = { [weak self] c in self?.push(c) } completionImpl = { [weak self] duration in if let strongSelf = self, let navigationController = strongSelf.navigationController as? NavigationController { -// let introController = PremiumIntroScreen(context: context, source: .gift(from: context.account.peerId, to: peerId, duration: duration)) var controllers = navigationController.viewControllers controllers = controllers.filter { !($0 is PeerInfoScreen) && !($0 is PremiumGiftScreen) } navigationController.setViewControllers(controllers, animated: true) - - Queue.mainQueue().after(2.8, { - if let topController = navigationController.viewControllers.last { - topController.view.addSubview(ConfettiView(frame: topController.view.bounds)) - } - }) } } } diff --git a/submodules/ShareController/Sources/ShareControllerNode.swift b/submodules/ShareController/Sources/ShareControllerNode.swift index 0130b9cb35..e014df4d9b 100644 --- a/submodules/ShareController/Sources/ShareControllerNode.swift +++ b/submodules/ShareController/Sources/ShareControllerNode.swift @@ -650,21 +650,23 @@ final class ShareControllerNode: ViewControllerTracingNode, UIScrollViewDelegate let doneImpl: (Bool) -> Void = { [weak self] shouldDelay in let minDelay: Double = shouldDelay ? 0.9 : 0.6 let delay: Double + let hapticDelay: Double + if let strongSelf = self, let contentNode = strongSelf.contentNode as? ShareProlongedLoadingContainerNode { delay = contentNode.completionDuration - - if shouldDelay { - Queue.mainQueue().after(delay - 1.5, { - if strongSelf.hapticFeedback == nil { - strongSelf.hapticFeedback = HapticFeedback() - } - strongSelf.hapticFeedback?.success() - }) - } + hapticDelay = shouldDelay ? delay - 1.5 : delay } else { delay = max(minDelay, (timestamp + minDelay) - CACurrentMediaTime()) + hapticDelay = delay } - + + Queue.mainQueue().after(hapticDelay, { + if self?.hapticFeedback == nil { + self?.hapticFeedback = HapticFeedback() + } + self?.hapticFeedback?.success() + }) + Queue.mainQueue().after(delay, { self?.animateOut(shared: true, completion: { self?.dismiss?(true)