mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-22 14:20:20 +00:00
[WIP] Video message send context menu
This commit is contained in:
@@ -39,6 +39,7 @@ swift_library(
|
||||
"//submodules/TelegramUI/Components/MediaEditor",
|
||||
"//submodules/LegacyMediaPickerUI",
|
||||
"//submodules/TelegramAudio",
|
||||
"//submodules/ChatSendMessageActionUI",
|
||||
],
|
||||
visibility = [
|
||||
"//visibility:public",
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user