diff --git a/submodules/AttachmentUI/Sources/AttachmentController.swift b/submodules/AttachmentUI/Sources/AttachmentController.swift index 696c7ad62f..4c8837c227 100644 --- a/submodules/AttachmentUI/Sources/AttachmentController.swift +++ b/submodules/AttachmentUI/Sources/AttachmentController.swift @@ -567,7 +567,7 @@ public class AttachmentController: ViewController { } } - private func minimize(damping: CGFloat? = nil, initialVelocity: CGFloat? = nil) { + fileprivate func minimize(damping: CGFloat? = nil, initialVelocity: CGFloat? = nil) { guard let controller = self.controller, let navigationController = controller.navigationController as? NavigationController else { return } @@ -1104,6 +1104,12 @@ public class AttachmentController: ViewController { self.hasTextInput = false self.requestLayout(transition: .immediate) } + + public func minimizeIfNeeded() { + if self.shouldMinimizeOnSwipe?(self.node.currentType) == true { + self.node.minimize() + } + } public func updateSelectionCount(_ count: Int) { self.node.updateSelectionCount(count, animated: false) diff --git a/submodules/TelegramUI/Components/MinimizedContainer/Sources/MinimizedHeaderNode.swift b/submodules/TelegramUI/Components/MinimizedContainer/Sources/MinimizedHeaderNode.swift index 7c3681def0..fde0731161 100644 --- a/submodules/TelegramUI/Components/MinimizedContainer/Sources/MinimizedHeaderNode.swift +++ b/submodules/TelegramUI/Components/MinimizedContainer/Sources/MinimizedHeaderNode.swift @@ -6,7 +6,12 @@ import SwiftSignalKit import TelegramPresentationData final class MinimizedHeaderNode: ASDisplayNode { - var theme: NavigationControllerTheme + var theme: NavigationControllerTheme { + didSet { + self.minimizedBackgroundNode.backgroundColor = self.theme.navigationBar.opaqueBackgroundColor + self.minimizedCloseButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Instant View/Close"), color: self.theme.navigationBar.primaryTextColor), for: .normal) + } + } let strings: PresentationStrings private let minimizedBackgroundNode: ASDisplayNode @@ -83,7 +88,7 @@ final class MinimizedHeaderNode: ASDisplayNode { self.minimizedTitleNode = ImmediateTextNode() self.minimizedCloseButton = HighlightableButtonNode() - self.minimizedCloseButton.setImage(UIImage(bundleImageName: "Instant View/Close"), for: .normal) + self.minimizedCloseButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Instant View/Close"), color: self.theme.navigationBar.primaryTextColor), for: .normal) super.init() diff --git a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/MediaAreaMaskView.swift b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/MediaAreaMaskView.swift new file mode 100644 index 0000000000..d2db1f1f21 --- /dev/null +++ b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/MediaAreaMaskView.swift @@ -0,0 +1,45 @@ +import Foundation +import UIKit +import Display +import TelegramCore + +final class MediaAreaMaskLayer: CALayer { + private var params: (referenceSize: CGSize, mediaAreas: [MediaArea])? + + func update(referenceSize: CGSize, mediaAreas: [MediaArea], borderMaskLayer: CALayer?) { + guard referenceSize != self.params?.referenceSize && mediaAreas != self.params?.mediaAreas else { + return + } + + for mediaArea in mediaAreas { + let size = CGSize(width: mediaArea.coordinates.width / 100.0 * referenceSize.width, height: mediaArea.coordinates.height / 100.0 * referenceSize.height) + let position = CGPoint(x: mediaArea.coordinates.x / 100.0 * referenceSize.width, y: mediaArea.coordinates.y / 100.0 * referenceSize.height) + let cornerRadius: CGFloat + if let radius = mediaArea.coordinates.cornerRadius { + cornerRadius = radius / 100.0 * size.width + } else { + cornerRadius = size.height * 0.18 + } + + let layer = CALayer() + layer.backgroundColor = UIColor.white.cgColor + layer.bounds = CGRect(origin: .zero, size: size) + layer.position = position + layer.cornerRadius = cornerRadius + layer.transform = CATransform3DMakeRotation(mediaArea.coordinates.rotation * Double.pi / 180.0, 0.0, 0.0, 1.0) + self.addSublayer(layer) + + if let borderMaskLayer { + let borderLayer = CAShapeLayer() + borderLayer.strokeColor = UIColor.white.cgColor + borderLayer.fillColor = UIColor.clear.cgColor + borderLayer.lineWidth = 2.0 + borderLayer.path = CGPath(roundedRect: CGRect(origin: .zero, size: size), cornerWidth: cornerRadius, cornerHeight: cornerRadius, transform: nil) + borderLayer.bounds = CGRect(origin: .zero, size: size) + borderLayer.position = position + borderLayer.transform = layer.transform + borderMaskLayer.addSublayer(borderLayer) + } + } + } +} diff --git a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemContentComponent.swift b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemContentComponent.swift index 675210777b..fd2bef3098 100644 --- a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemContentComponent.swift +++ b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemContentComponent.swift @@ -917,7 +917,18 @@ final class StoryItemContentComponent: Component { mediaAreasEffectView.removeFromSuperview() } } - if !component.item.mediaAreas.isEmpty { + + let shimmeringMediaAreas: [MediaArea] = component.item.mediaAreas.filter { mediaArea in + if case .link = mediaArea { + return true + } else if case .venue = mediaArea { + return true + } else { + return false + } + } + + if !shimmeringMediaAreas.isEmpty { let mediaAreasEffectView: StoryItemLoadingEffectView if let current = self.mediaAreasEffectView { mediaAreasEffectView = current @@ -928,44 +939,14 @@ final class StoryItemContentComponent: Component { } mediaAreasEffectView.update(size: availableSize, transition: transition) - let maskLayer: CALayer - if let current = mediaAreasEffectView.layer.mask { + let maskLayer: MediaAreaMaskLayer + if let current = mediaAreasEffectView.layer.mask as? MediaAreaMaskLayer { maskLayer = current } else { - maskLayer = CALayer() + maskLayer = MediaAreaMaskLayer() mediaAreasEffectView.layer.mask = maskLayer } - - if (maskLayer.sublayers ?? []).isEmpty { - let referenceSize = availableSize - for mediaArea in component.item.mediaAreas { - guard case .venue = mediaArea else { - continue - } - let size = CGSize(width: mediaArea.coordinates.width / 100.0 * referenceSize.width, height: mediaArea.coordinates.height / 100.0 * referenceSize.height) - let position = CGPoint(x: mediaArea.coordinates.x / 100.0 * referenceSize.width, y: mediaArea.coordinates.y / 100.0 * referenceSize.height) - let cornerRadius = size.height * 0.18 - - let layer = CALayer() - layer.backgroundColor = UIColor.white.cgColor - layer.bounds = CGRect(origin: .zero, size: size) - layer.position = position - layer.cornerRadius = cornerRadius - maskLayer.addSublayer(layer) - - let borderLayer = CAShapeLayer() - borderLayer.strokeColor = UIColor.white.cgColor - borderLayer.fillColor = UIColor.clear.cgColor - borderLayer.lineWidth = 2.0 - borderLayer.path = CGPath(roundedRect: CGRect(origin: .zero, size: size), cornerWidth: cornerRadius, cornerHeight: cornerRadius, transform: nil) - borderLayer.bounds = CGRect(origin: .zero, size: size) - borderLayer.position = position - mediaAreasEffectView.borderMaskLayer.addSublayer(borderLayer) - - layer.transform = CATransform3DMakeRotation(mediaArea.coordinates.rotation * Double.pi / 180.0, 0.0, 0.0, 1.0) - borderLayer.transform = layer.transform - } - } + maskLayer.update(referenceSize: availableSize, mediaAreas: shimmeringMediaAreas, borderMaskLayer: mediaAreasEffectView.borderMaskLayer) } else if let mediaAreasEffectView = self.mediaAreasEffectView { self.mediaAreasEffectView = nil mediaAreasEffectView.removeFromSuperview() diff --git a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerComponent.swift b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerComponent.swift index 68f236209e..8f416abce8 100644 --- a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerComponent.swift +++ b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerComponent.swift @@ -913,9 +913,6 @@ public final class StoryItemSetContainerComponent: Component { @objc private func tapGesture(_ recognizer: UITapGestureRecognizer) { if case .ended = recognizer.state, let component = self.component, let itemLayout = self.itemLayout { - if let _ = self.sendMessageContext.menuController { - return - } if self.displayLikeReactions { self.displayLikeReactions = false self.sendMessageContext.currentInputMode = .text diff --git a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerViewSendMessage.swift b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerViewSendMessage.swift index f80d8ec604..485b879508 100644 --- a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerViewSendMessage.swift +++ b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerViewSendMessage.swift @@ -3347,32 +3347,7 @@ final class StoryItemSetContainerSendMessage { var actions: [ContextMenuAction] = [] switch mediaArea { case let .venue(coordinates, venue): - let action = { [weak controller, weak view] in - let _ = view - /*let subject = EngineMessage(stableId: 0, stableVersion: 0, id: EngineMessage.Id(peerId: PeerId(0), namespace: 0, id: 0), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, threadId: nil, timestamp: 0, flags: [], tags: [], globalTags: [], localTags: [], customTags: [], forwardInfo: nil, author: nil, text: "", attributes: [], media: [.geo(TelegramMediaMap(latitude: venue.latitude, longitude: venue.longitude, heading: nil, accuracyRadius: nil, geoPlace: nil, venue: venue.venue, liveBroadcastingTimeout: nil, liveProximityNotificationRadius: nil))], peers: [:], associatedMessages: [:], associatedMessageIds: [], associatedMedia: [:], associatedThreadInfo: nil, associatedStories: [:]) - let locationController = LocationViewController( - context: context, - updatedPresentationData: updatedPresentationData, - subject: subject, - isStoryLocation: true, - params: LocationViewParams( - sendLiveLocation: { _ in }, - stopLiveLocation: { _ in }, - openUrl: { url in - context.sharedContext.applicationBindings.openUrl(url) - }, - openPeer: { _ in } - ) - ) - view?.updateModalTransitionFactor(1.0, transition: .animated(duration: 0.5, curve: .spring)) - locationController.dismissed = { [weak view] in - view?.updateModalTransitionFactor(0.0, transition: .animated(duration: 0.5, curve: .spring)) - Queue.mainQueue().after(0.5, { - view?.updateIsProgressPaused() - }) - } - controller?.push(locationController)*/ - + let action = { [weak controller] in let searchController = context.sharedContext.makeStorySearchController(context: context, scope: .location(coordinates: coordinates, venue: venue), listContext: nil) controller?.push(searchController) } @@ -3475,12 +3450,16 @@ final class StoryItemSetContainerSendMessage { let node = controller.displayNode let menuController = makeContextMenuController(actions: actions, blurred: true) menuController.centerHorizontally = true - menuController.dismissed = { [weak self, weak view] in + menuController.dismissed = { [weak self, weak view, weak menuController] in if let self, let view { - self.selectedMediaArea = nil - Queue.mainQueue().after(0.1) { - self.menuController = nil - view.updateIsProgressPaused() + if self.menuController === menuController { + self.selectedMediaArea = nil + Queue.mainQueue().after(0.1) { + if self.menuController === menuController { + self.menuController = nil + view.updateIsProgressPaused() + } + } } } } diff --git a/submodules/TelegramUI/Sources/ApplicationContext.swift b/submodules/TelegramUI/Sources/ApplicationContext.swift index 3168d436b3..bb989c7cc0 100644 --- a/submodules/TelegramUI/Sources/ApplicationContext.swift +++ b/submodules/TelegramUI/Sources/ApplicationContext.swift @@ -30,6 +30,7 @@ import ChatListUI import StoryContainerScreen import ChatMessageNotificationItem import PhoneNumberFormat +import AttachmentUI final class UnauthorizedApplicationContext { let sharedContext: SharedAccountContextImpl @@ -436,6 +437,10 @@ final class AuthorizedApplicationContext { return false } + if let topContoller = strongSelf.rootController.topViewController as? AttachmentController { + topContoller.minimizeIfNeeded() + } + for controller in strongSelf.rootController.viewControllers { if let controller = controller as? ChatControllerImpl, controller.chatLocation.peerId == chatLocation.peerId, (controller.chatLocation.threadId == nil || controller.chatLocation.threadId == chatLocation.threadId) { return true diff --git a/submodules/TelegramUI/Sources/ChatControllerOpenAttachmentMenu.swift b/submodules/TelegramUI/Sources/ChatControllerOpenAttachmentMenu.swift index 37c7a340d8..366751ca81 100644 --- a/submodules/TelegramUI/Sources/ChatControllerOpenAttachmentMenu.swift +++ b/submodules/TelegramUI/Sources/ChatControllerOpenAttachmentMenu.swift @@ -43,6 +43,10 @@ extension ChatControllerImpl { } func presentAttachmentMenu(subject: AttachMenuSubject) { + guard self.audioRecorderValue == nil && self.videoRecorderValue == nil else { + return + } + let context = self.context let inputIsActive = self.presentationInterfaceState.inputMode == .text diff --git a/submodules/WebUI/Sources/WebAppController.swift b/submodules/WebUI/Sources/WebAppController.swift index 4073a2e67e..50abb887e3 100644 --- a/submodules/WebUI/Sources/WebAppController.swift +++ b/submodules/WebUI/Sources/WebAppController.swift @@ -1935,16 +1935,6 @@ public final class WebAppController: ViewController, AttachmentContainable { let attachMenuBot = attachMenuBots.first(where: { $0.peer.id == botId && !$0.flags.contains(.notActivated) }) -// items.append(.action(ContextMenuActionItem(text: "Minimize", icon: { theme in -// return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/HideArchive"), color: theme.contextMenu.primaryColor) -// }, action: { [weak self] c, _ in -// c?.dismiss(completion: nil) -// -// if let self, let parentController = self.parentController(), let navigationController = self.getNavigationController() { -// navigationController.minimizeViewController(parentController, animated: true) -// } -// }))) - if hasSettings { items.append(.action(ContextMenuActionItem(text: presentationData.strings.WebApp_Settings, icon: { theme in return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Settings"), color: theme.contextMenu.primaryColor)