[WIP] Video message send context menu

This commit is contained in:
Isaac
2024-05-13 23:37:30 +04:00
parent 8736981248
commit 3da1b96775
6 changed files with 224 additions and 49 deletions

View File

@@ -39,6 +39,7 @@ swift_library(
"//submodules/TelegramUI/Components/MediaEditor",
"//submodules/LegacyMediaPickerUI",
"//submodules/TelegramAudio",
"//submodules/ChatSendMessageActionUI",
],
visibility = [
"//visibility:public",

View File

@@ -27,6 +27,7 @@ import LocalMediaResources
import ImageCompression
import LegacyMediaPickerUI
import TelegramAudio
import ChatSendMessageActionUI
struct CameraState: Equatable {
enum Recording: Equatable {
@@ -553,6 +554,7 @@ public class VideoMessageCameraScreen: ViewController {
fileprivate let containerView: UIView
fileprivate let componentHost: ComponentView<ViewControllerComponentContainer.Environment>
fileprivate let previewContainerView: UIView
fileprivate let previewContainerContentView: UIView
private var previewSnapshotView: UIView?
private var previewBlurView: BlurView
@@ -625,7 +627,10 @@ public class VideoMessageCameraScreen: ViewController {
self.componentHost = ComponentView<ViewControllerComponentContainer.Environment>()
self.previewContainerView = UIView()
self.previewContainerView.clipsToBounds = true
self.previewContainerContentView = UIView()
self.previewContainerContentView.clipsToBounds = true
self.previewContainerView.addSubview(self.previewContainerContentView)
let isDualCameraEnabled = Camera.isDualCameraSupported(forRoundVideo: true)
let isFrontPosition = "".isEmpty
@@ -666,13 +671,13 @@ public class VideoMessageCameraScreen: ViewController {
self.containerView.addSubview(self.previewContainerView)
self.previewContainerView.addSubview(self.mainPreviewView)
self.previewContainerContentView.addSubview(self.mainPreviewView)
if isDualCameraEnabled {
self.previewContainerView.addSubview(self.additionalPreviewView)
self.previewContainerContentView.addSubview(self.additionalPreviewView)
}
self.previewContainerView.addSubview(self.progressView)
self.previewContainerView.addSubview(self.previewBlurView)
self.previewContainerView.addSubview(self.loadingView)
self.previewContainerContentView.addSubview(self.progressView)
self.previewContainerContentView.addSubview(self.previewBlurView)
self.previewContainerContentView.addSubview(self.loadingView)
self.completion.connect { [weak self] result in
if let self {
@@ -837,7 +842,7 @@ public class VideoMessageCameraScreen: ViewController {
private func animatePositionChange() {
if let snapshotView = self.mainPreviewView.snapshotView(afterScreenUpdates: false) {
self.previewContainerView.insertSubview(snapshotView, belowSubview: self.progressView)
self.previewContainerContentView.insertSubview(snapshotView, belowSubview: self.progressView)
self.previewSnapshotView = snapshotView
let action = { [weak self] in
@@ -872,7 +877,7 @@ public class VideoMessageCameraScreen: ViewController {
func resumeCameraCapture() {
if !self.mainPreviewView.isEnabled {
if let snapshotView = self.resultPreviewView?.snapshotView(afterScreenUpdates: false) {
self.previewContainerView.insertSubview(snapshotView, belowSubview: self.previewBlurView)
self.previewContainerContentView.insertSubview(snapshotView, belowSubview: self.previewBlurView)
self.previewSnapshotView = snapshotView
}
self.mainPreviewView.isEnabled = true
@@ -1148,8 +1153,9 @@ public class VideoMessageCameraScreen: ViewController {
}
if !self.animatingIn {
transition.setFrame(view: self.previewContainerView, frame: previewFrame)
transition.setFrame(view: self.previewContainerContentView, frame: CGRect(origin: CGPoint(), size: previewFrame.size))
}
transition.setCornerRadius(layer: self.previewContainerView.layer, cornerRadius: previewSide / 2.0)
transition.setCornerRadius(layer: self.previewContainerContentView.layer, cornerRadius: previewSide / 2.0)
let previewBounds = CGRect(origin: .zero, size: previewFrame.size)
@@ -1244,7 +1250,7 @@ public class VideoMessageCameraScreen: ViewController {
}, transition: .easeInOut(duration: 0.2))
}
}
self.previewContainerView.addSubview(resultPreviewView)
self.previewContainerContentView.addSubview(resultPreviewView)
self.resultPreviewView = resultPreviewView
resultPreviewView.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2)
@@ -1730,6 +1736,10 @@ public class VideoMessageCameraScreen: ViewController {
(self.displayNode as! Node).containerLayoutUpdated(layout: layout, transition: Transition(transition))
}
}
public func makeSendMessageContextPreview() -> ChatSendMessageContextScreenMediaPreview? {
return VideoMessageSendMessageContextPreview(node: self.node)
}
}
private func composition(with results: [VideoMessageCameraScreen.CaptureResult]) -> AVComposition {
@@ -1797,3 +1807,84 @@ private class BlurView: UIVisualEffectView {
self.setup()
}
}
private final class VideoMessageSendMessageContextPreview: UIView, ChatSendMessageContextScreenMediaPreview {
var isReady: Signal<Bool, NoError> {
return .single(true)
}
var view: UIView {
return self
}
var globalClippingRect: CGRect? {
return nil
}
var layoutType: ChatSendMessageContextScreenMediaPreviewLayoutType {
return .videoMessage
}
private weak var previewContainerContentParentView: UIView?
private let previewContainerContentView: UIView
init(node: VideoMessageCameraScreen.Node) {
self.previewContainerContentParentView = node.previewContainerView
self.previewContainerContentView = node.previewContainerContentView
super.init(frame: CGRect())
}
required init(coder: NSCoder) {
preconditionFailure()
}
func animateIn(transition: Transition) {
self.addSubview(self.previewContainerContentView)
guard let previewContainerContentParentView = self.previewContainerContentParentView else {
return
}
let fromFrame = previewContainerContentParentView.convert(CGRect(origin: CGPoint(), size: self.previewContainerContentView.bounds.size), to: self)
let toFrame = self.previewContainerContentView.frame
transition.animatePosition(view: self.previewContainerContentView, from: CGPoint(x: fromFrame.midX - toFrame.midX, y: fromFrame.midY - toFrame.midY), to: CGPoint(), additive: true)
}
func animateOut(transition: Transition) {
guard let previewContainerContentParentView = self.previewContainerContentParentView else {
return
}
let toFrame = previewContainerContentParentView.convert(CGRect(origin: CGPoint(), size: self.previewContainerContentView.bounds.size), to: self)
let previewContainerContentView = self.previewContainerContentView
transition.setPosition(view: self.previewContainerContentView, position: toFrame.center, completion: { [weak previewContainerContentParentView, weak previewContainerContentView] _ in
guard let previewContainerContentParentView, let previewContainerContentView else {
return
}
previewContainerContentView.frame = CGRect(origin: CGPoint(), size: previewContainerContentView.bounds.size)
previewContainerContentParentView.addSubview(previewContainerContentView)
})
}
func animateOutOnSend(transition: Transition) {
guard let previewContainerContentParentView = self.previewContainerContentParentView else {
return
}
if let snapshotView = self.previewContainerContentView.snapshotView(afterScreenUpdates: false) {
self.addSubview(snapshotView)
transition.setAlpha(view: snapshotView, alpha: 0.0)
}
self.previewContainerContentView.frame = CGRect(origin: CGPoint(), size: self.previewContainerContentView.bounds.size)
previewContainerContentParentView.addSubview(self.previewContainerContentView)
}
func update(containerSize: CGSize, transition: Transition) -> CGSize {
return self.previewContainerContentView.bounds.size
}
}