Camera and editor fixes

This commit is contained in:
Ilya Laktyushin
2023-06-25 20:35:06 +02:00
parent 6ba424f13d
commit e4a1cb33f0
9 changed files with 334 additions and 283 deletions

View File

@@ -305,8 +305,8 @@ private final class CameraScreenComponent: CombinedComponent {
self.cameraState = self.cameraState.updatedRecording(.none).updatedDuration(0.0)
self.resultDisposable.set((self.camera.stopRecording()
|> deliverOnMainQueue).start(next: { [weak self] result in
if let self, case let .finished(mainResult, additionalResult, _) = result {
self.completion.invoke(.single(.video(mainResult.0, mainResult.1, additionalResult?.0, additionalResult?.1, PixelDimensions(width: 1080, height: 1920), .bottomRight)))
if let self, case let .finished(mainResult, additionalResult, duration, positionChangeTimestamps, _) = result {
self.completion.invoke(.single(.video(mainResult.0, mainResult.1, additionalResult?.0, additionalResult?.1, PixelDimensions(width: 1080, height: 1920), duration, positionChangeTimestamps, .bottomRight)))
}
}))
self.isTransitioning = true
@@ -741,8 +741,6 @@ private final class CameraScreenComponent: CombinedComponent {
}
}
private let useSimplePreviewView = true
private class BlurView: UIVisualEffectView {
private func setup() {
for subview in self.subviews {
@@ -803,7 +801,7 @@ public class CameraScreen: ViewController {
public enum Result {
case pendingImage
case image(UIImage, UIImage?, CameraScreen.PIPPosition)
case video(String, UIImage?, String?, UIImage?, PixelDimensions, CameraScreen.PIPPosition)
case video(String, UIImage?, String?, UIImage?, PixelDimensions, Double, [(Bool, Double)], CameraScreen.PIPPosition)
case asset(PHAsset)
case draft(MediaEditorDraft)
@@ -811,8 +809,8 @@ public class CameraScreen: ViewController {
switch self {
case let .image(mainImage, additionalImage, _):
return .image(mainImage, additionalImage, position)
case let .video(mainPath, mainImage, additionalPath, additionalImage, dimensions, _):
return .video(mainPath, mainImage, additionalPath, additionalImage, dimensions, position)
case let .video(mainPath, mainImage, additionalPath, additionalImage, dimensions, duration, positionChangeTimestamps, _):
return .video(mainPath, mainImage, additionalPath, additionalImage, dimensions, duration, positionChangeTimestamps, position)
default:
return self
}
@@ -860,11 +858,15 @@ public class CameraScreen: ViewController {
fileprivate let containerView: UIView
fileprivate let componentHost: ComponentView<ViewControllerComponentContainer.Environment>
private let previewContainerView: UIView
fileprivate let previewView: CameraPreviewView?
fileprivate let simplePreviewView: CameraSimplePreviewView?
fileprivate var additionalPreviewView: CameraSimplePreviewView?
private let mainPreviewContainerView: UIView
fileprivate var mainPreviewView: CameraSimplePreviewView
private let additionalPreviewContainerView: UIView
fileprivate var additionalPreviewView: CameraSimplePreviewView
fileprivate let previewBlurView: BlurView
private var previewSnapshotView: UIView?
private var mainPreviewSnapshotView: UIView?
private var additionalPreviewSnapshotView: UIView?
fileprivate let previewFrameLeftDimView: UIView
fileprivate let previewFrameRightDimView: UIView
@@ -881,47 +883,7 @@ public class CameraScreen: ViewController {
private var cameraPosition: Camera.Position = .back
private let completion = ActionSlot<Signal<CameraScreen.Result, NoError>>()
private var effectivePreviewView: UIView {
if let simplePreviewView = self.simplePreviewView {
return simplePreviewView
} else if let previewView = self.previewView {
return previewView
} else {
fatalError()
}
}
private var currentPreviewView: UIView {
if let simplePreviewView = self.simplePreviewView {
if let additionalPreviewView = self.additionalPreviewView {
if self.isDualCamEnabled && cameraPosition == .front {
return additionalPreviewView
} else {
return simplePreviewView
}
} else {
return simplePreviewView
}
} else if let previewView = self.previewView {
return previewView
} else {
fatalError()
}
}
private var currentAdditionalPreviewView: UIView? {
if let additionalPreviewView = self.additionalPreviewView {
if self.isDualCamEnabled && cameraPosition == .front {
return self.simplePreviewView
} else {
return additionalPreviewView
}
} else {
return nil
}
}
fileprivate var previewBlurPromise = ValuePromise<Bool>(false)
private let flipAnimationAction = ActionSlot<Void>()
@@ -953,36 +915,22 @@ public class CameraScreen: ViewController {
self.previewBlurView = BlurView()
self.previewBlurView.isUserInteractionEnabled = false
if let holder = controller.holder {
self.simplePreviewView = nil
self.previewView = holder.previewView
self.camera = holder.camera
} else {
if useSimplePreviewView {
self.simplePreviewView = CameraSimplePreviewView(frame: .zero, additional: false)
self.previewView = nil
self.additionalPreviewView = CameraSimplePreviewView(frame: .zero, additional: true)
self.additionalPreviewView?.clipsToBounds = true
} else {
self.previewView = CameraPreviewView(test: false)!
self.simplePreviewView = nil
}
var cameraFrontPosition = false
if let useCameraFrontPosition = UserDefaults.standard.object(forKey: "TelegramStoryCameraUseFrontPosition") as? NSNumber, useCameraFrontPosition.boolValue {
cameraFrontPosition = true
}
self.cameraPosition = cameraFrontPosition ? .front : .back
self.camera = Camera(configuration: Camera.Configuration(preset: .hd1920x1080, position: self.cameraPosition, audio: true, photo: true, metadata: false, preferredFps: 60.0), previewView: self.simplePreviewView, secondaryPreviewView: self.additionalPreviewView)
if !useSimplePreviewView {
#if targetEnvironment(simulator)
#else
self.camera.attachPreviewView(self.previewView!)
#endif
}
self.mainPreviewContainerView = UIView()
self.mainPreviewContainerView.clipsToBounds = true
self.mainPreviewView = CameraSimplePreviewView(frame: .zero, main: true)
self.additionalPreviewContainerView = UIView()
self.additionalPreviewContainerView.clipsToBounds = true
self.additionalPreviewView = CameraSimplePreviewView(frame: .zero, main: false)
var cameraFrontPosition = false
if let useCameraFrontPosition = UserDefaults.standard.object(forKey: "TelegramStoryCameraUseFrontPosition") as? NSNumber, useCameraFrontPosition.boolValue {
cameraFrontPosition = true
}
self.mainPreviewView.resetPlaceholder(front: cameraFrontPosition)
self.cameraPosition = cameraFrontPosition ? .front : .back
self.camera = Camera(configuration: Camera.Configuration(preset: .hd1920x1080, position: self.cameraPosition, audio: true, photo: true, metadata: false, preferredFps: 60.0), previewView: self.mainPreviewView, secondaryPreviewView: self.additionalPreviewView)
self.previewFrameLeftDimView = UIView()
self.previewFrameLeftDimView.backgroundColor = UIColor(rgb: 0x000000, alpha: 0.6)
@@ -1006,17 +954,17 @@ public class CameraScreen: ViewController {
self.view.addSubview(self.containerView)
self.containerView.addSubview(self.previewContainerView)
self.previewContainerView.addSubview(self.effectivePreviewView)
self.previewContainerView.addSubview(self.mainPreviewContainerView)
self.previewContainerView.addSubview(self.additionalPreviewContainerView)
self.previewContainerView.addSubview(self.previewBlurView)
self.previewContainerView.addSubview(self.previewFrameLeftDimView)
self.previewContainerView.addSubview(self.previewFrameRightDimView)
self.containerView.addSubview(self.transitionDimView)
self.view.addSubview(self.transitionCornersView)
if let additionalPreviewView = self.additionalPreviewView {
self.previewContainerView.insertSubview(additionalPreviewView, at: 1)
}
self.mainPreviewContainerView.addSubview(self.mainPreviewView)
self.additionalPreviewContainerView.addSubview(self.additionalPreviewView)
self.changingPositionDisposable = combineLatest(
queue: Queue.mainQueue(),
self.camera.modeChange,
@@ -1024,18 +972,36 @@ public class CameraScreen: ViewController {
).start(next: { [weak self] modeChange, forceBlur in
if let self {
if modeChange != .none {
if let snapshot = self.simplePreviewView?.snapshotView(afterScreenUpdates: false) {
self.simplePreviewView?.addSubview(snapshot)
self.previewSnapshotView = snapshot
// if case .dualCamera = modeChange, self.cameraPosition == .front {
// if self.isDualCamEnabled {
// if let snapshot = self.mainPreviewView.snapshotView(afterScreenUpdates: false) {
// snapshot.frame = CGRect(origin: .zero, size: self.mainPreviewContainerView.bounds.size)
// self.mainPreviewView.addSubview(snapshot)
// self.previewSnapshotView = snapshot
// }
// } else {
// if let snapshot = self.mainPreviewView.snapshotView(afterScreenUpdates: false) {
// snapshot.frame = CGRect(origin: .zero, size: self.mainPreviewContainerView.bounds.size)
// self.additionalPreviewView.addSubview(snapshot)
// self.additionalPreviewSnapshotView = snapshot
// }
// }
// } else {
if case .dualCamera = modeChange, self.cameraPosition == .front {
} else {
if let snapshot = self.mainPreviewView.snapshotView(afterScreenUpdates: false) {
self.mainPreviewView.addSubview(snapshot)
self.mainPreviewSnapshotView = snapshot
}
}
if case .position = modeChange {
UIView.transition(with: self.previewContainerView, duration: 0.4, options: [.transitionFlipFromLeft, .curveEaseOut], animations: {
self.previewBlurView.effect = UIBlurEffect(style: .dark)
})
} else {
if let additionalPreviewView = self.additionalPreviewView {
self.previewContainerView.insertSubview(self.previewBlurView, belowSubview: additionalPreviewView)
}
self.previewContainerView.insertSubview(self.previewBlurView, belowSubview: self.additionalPreviewContainerView)
UIView.animate(withDuration: 0.4) {
self.previewBlurView.effect = UIBlurEffect(style: .dark)
}
@@ -1045,16 +1011,16 @@ public class CameraScreen: ViewController {
self.previewBlurView.effect = UIBlurEffect(style: .dark)
}
} else {
UIView.animate(withDuration: 0.4, animations: {
self.previewBlurView.effect = nil
}, completion: { _ in
if let additionalPreviewView = self.additionalPreviewView {
self.previewContainerView.insertSubview(self.previewBlurView, aboveSubview: additionalPreviewView)
}
})
if self.previewBlurView.effect != nil {
UIView.animate(withDuration: 0.4, animations: {
self.previewBlurView.effect = nil
}, completion: { _ in
self.previewContainerView.insertSubview(self.previewBlurView, aboveSubview: self.additionalPreviewContainerView)
})
}
if let previewSnapshotView = self.previewSnapshotView {
self.previewSnapshotView = nil
if let previewSnapshotView = self.mainPreviewSnapshotView {
self.mainPreviewSnapshotView = nil
UIView.animate(withDuration: 0.25, animations: {
previewSnapshotView.alpha = 0.0
}, completion: { _ in
@@ -1072,7 +1038,8 @@ public class CameraScreen: ViewController {
}
if self.isDualCamEnabled {
self.additionalPreviewView?.removePlaceholder()
self.mainPreviewView.removePlaceholder()
self.additionalPreviewView.removePlaceholder()
}
}
}
@@ -1093,9 +1060,9 @@ public class CameraScreen: ViewController {
}
if case .pendingImage = value {
Queue.mainQueue().async {
self.simplePreviewView?.isEnabled = false
self.mainPreviewView.isEnabled = false
self.additionalPreviewView?.isEnabled = false
self.additionalPreviewView.isEnabled = false
}
} else {
Queue.mainQueue().async {
@@ -1104,8 +1071,8 @@ public class CameraScreen: ViewController {
self.previewBlurPromise.set(true)
}
}
self.simplePreviewView?.isEnabled = false
self.additionalPreviewView?.isEnabled = false
self.mainPreviewView.isEnabled = false
self.additionalPreviewView.isEnabled = false
self.camera.stopCapture()
}
}
@@ -1119,25 +1086,32 @@ public class CameraScreen: ViewController {
self.updateState.connect { [weak self] state in
if let self {
let previousPosition = self.cameraPosition
self.cameraPosition = state.position
let newPosition = state.position != .unspecified ? state.position : previousPosition
self.cameraPosition = newPosition
let dualCamWasEnabled = self.isDualCamEnabled
self.isDualCamEnabled = state.isDualCamEnabled
if self.isDualCamEnabled && previousPosition != state.position, let additionalPreviewView = self.additionalPreviewView {
if state.position == .front {
additionalPreviewView.superview?.sendSubviewToBack(additionalPreviewView)
if self.isDualCamEnabled != dualCamWasEnabled && newPosition == .front {
if self.isDualCamEnabled {
if let cloneView = self.mainPreviewView.snapshotView(afterScreenUpdates: false) {
self.mainPreviewSnapshotView = cloneView
self.mainPreviewContainerView.addSubview(cloneView)
}
} else {
additionalPreviewView.superview?.insertSubview(additionalPreviewView, aboveSubview: self.simplePreviewView!)
if let cloneView = self.additionalPreviewView.snapshotView(afterScreenUpdates: false) {
self.mainPreviewSnapshotView = cloneView
self.mainPreviewContainerView.addSubview(cloneView)
}
}
}
if self.isDualCamEnabled && previousPosition != newPosition {
CATransaction.begin()
CATransaction.setDisableActions(true)
self.requestUpdateLayout(hasAppeared: false, transition: .immediate)
CATransaction.commit()
} else {
if !dualCamWasEnabled && self.isDualCamEnabled {
}
} else if dualCamWasEnabled != self.isDualCamEnabled {
self.requestUpdateLayout(hasAppeared: false, transition: .spring(duration: 0.4))
}
}
@@ -1155,17 +1129,17 @@ public class CameraScreen: ViewController {
self.view.disablesInteractiveKeyboardGestureRecognizer = true
let pinchGestureRecognizer = UIPinchGestureRecognizer(target: self, action: #selector(self.handlePinch(_:)))
self.effectivePreviewView.addGestureRecognizer(pinchGestureRecognizer)
self.mainPreviewContainerView.addGestureRecognizer(pinchGestureRecognizer)
let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(self.handlePan(_:)))
panGestureRecognizer.maximumNumberOfTouches = 1
self.effectivePreviewView.addGestureRecognizer(panGestureRecognizer)
self.mainPreviewContainerView.addGestureRecognizer(panGestureRecognizer)
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))
self.effectivePreviewView.addGestureRecognizer(tapGestureRecognizer)
self.mainPreviewContainerView.addGestureRecognizer(tapGestureRecognizer)
let pipPanGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(self.handlePipPan(_:)))
self.additionalPreviewView?.addGestureRecognizer(pipPanGestureRecognizer)
self.additionalPreviewContainerView.addGestureRecognizer(pipPanGestureRecognizer)
self.camera.focus(at: CGPoint(x: 0.5, y: 0.5), autoFocus: true)
self.camera.startCapture()
@@ -1217,11 +1191,8 @@ public class CameraScreen: ViewController {
}
@objc private func handleTap(_ gestureRecognizer: UITapGestureRecognizer) {
guard let previewView = self.simplePreviewView else {
return
}
let location = gestureRecognizer.location(in: previewView)
let point = previewView.cameraPoint(for: location)
let location = gestureRecognizer.location(in: mainPreviewView)
let point = mainPreviewView.cameraPoint(for: location)
self.camera.focus(at: point, autoFocus: false)
}
@@ -1347,8 +1318,8 @@ public class CameraScreen: ViewController {
}
func pauseCameraCapture() {
self.simplePreviewView?.isEnabled = false
self.additionalPreviewView?.isEnabled = false
self.mainPreviewView.isEnabled = false
self.additionalPreviewView.isEnabled = false
Queue.mainQueue().after(0.3) {
self.previewBlurPromise.set(true)
}
@@ -1356,21 +1327,21 @@ public class CameraScreen: ViewController {
}
func resumeCameraCapture() {
if self.simplePreviewView?.isEnabled == false {
if let snapshot = self.simplePreviewView?.snapshotView(afterScreenUpdates: false) {
self.simplePreviewView?.addSubview(snapshot)
self.previewSnapshotView = snapshot
if !self.mainPreviewView.isEnabled {
if let snapshot = self.mainPreviewView.snapshotView(afterScreenUpdates: false) {
self.mainPreviewView.addSubview(snapshot)
self.mainPreviewSnapshotView = snapshot
}
if let snapshot = self.additionalPreviewView?.snapshotView(afterScreenUpdates: false) {
self.additionalPreviewView?.addSubview(snapshot)
if let snapshot = self.additionalPreviewView.snapshotView(afterScreenUpdates: false) {
self.additionalPreviewView.addSubview(snapshot)
self.additionalPreviewSnapshotView = snapshot
}
self.simplePreviewView?.isEnabled = true
self.additionalPreviewView?.isEnabled = true
self.mainPreviewView.isEnabled = true
self.additionalPreviewView.isEnabled = true
self.camera.startCapture()
if #available(iOS 13.0, *), let isPreviewing = self.simplePreviewView?.isPreviewing {
let _ = (isPreviewing
if #available(iOS 13.0, *) {
let _ = (self.mainPreviewView.isPreviewing
|> filter {
$0
}
@@ -1467,10 +1438,10 @@ public class CameraScreen: ViewController {
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
let result = super.hitTest(point, with: event)
if result == self.componentHost.view {
if let additionalPreviewView = self.additionalPreviewView, additionalPreviewView.bounds.contains(self.view.convert(point, to: additionalPreviewView)) {
return additionalPreviewView
if self.additionalPreviewView.bounds.contains(self.view.convert(point, to: self.additionalPreviewView)) {
return self.additionalPreviewView
} else {
return self.effectivePreviewView
return self.mainPreviewView
}
}
return result
@@ -1569,7 +1540,7 @@ public class CameraScreen: ViewController {
panelWidth: panelWidth,
flipAnimationAction: self.flipAnimationAction,
animateShutter: { [weak self] in
self?.effectivePreviewView.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.25)
self?.mainPreviewContainerView.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.25)
},
present: { [weak self] c in
self?.controller?.present(c, in: .window(.root))
@@ -1605,58 +1576,77 @@ public class CameraScreen: ViewController {
transition.setFrame(view: self.transitionDimView, frame: CGRect(origin: .zero, size: layout.size))
transition.setFrame(view: self.previewContainerView, frame: previewFrame)
self.currentPreviewView.layer.cornerRadius = 0.0
transition.setFrame(view: self.currentPreviewView, frame: CGRect(origin: .zero, size: previewFrame.size))
transition.setFrame(view: self.mainPreviewContainerView, frame: CGRect(origin: .zero, size: previewFrame.size))
transition.setFrame(view: self.previewBlurView, frame: CGRect(origin: .zero, size: previewFrame.size))
if let additionalPreviewView = self.currentAdditionalPreviewView as? CameraSimplePreviewView {
let dualCamUpdated = self.appliedDualCam != self.isDualCamEnabled
self.appliedDualCam = self.isDualCamEnabled
additionalPreviewView.layer.cornerRadius = 80.0
var origin: CGPoint
switch self.pipPosition {
case .topLeft:
origin = CGPoint(x: 10.0, y: 110.0)
if !self.isDualCamEnabled {
origin = origin.offsetBy(dx: -180.0, dy: 0.0)
}
case .topRight:
origin = CGPoint(x: previewFrame.width - 160.0 - 10.0, y: 110.0)
if !self.isDualCamEnabled {
origin = origin.offsetBy(dx: 180.0, dy: 0.0)
}
case .bottomLeft:
origin = CGPoint(x: 10.0, y: previewFrame.height - 160.0 - 110.0)
if !self.isDualCamEnabled {
origin = origin.offsetBy(dx: -180.0, dy: 0.0)
}
case .bottomRight:
origin = CGPoint(x: previewFrame.width - 160.0 - 10.0, y: previewFrame.height - 160.0 - 110.0)
if !self.isDualCamEnabled {
origin = origin.offsetBy(dx: 180.0, dy: 0.0)
}
let dualCamUpdated = self.appliedDualCam != self.isDualCamEnabled
self.appliedDualCam = self.isDualCamEnabled
var origin: CGPoint
switch self.pipPosition {
case .topLeft:
origin = CGPoint(x: 10.0, y: 110.0)
if !self.isDualCamEnabled {
origin = origin.offsetBy(dx: -180.0, dy: 0.0)
}
if let pipTranslation = self.pipTranslation {
origin = origin.offsetBy(dx: pipTranslation.x, dy: pipTranslation.y)
case .topRight:
origin = CGPoint(x: previewFrame.width - 160.0 - 10.0, y: 110.0)
if !self.isDualCamEnabled {
origin = origin.offsetBy(dx: 180.0, dy: 0.0)
}
let additionalPreviewFrame = CGRect(origin: origin, size: CGSize(width: 160.0, height: 160.0))
transition.setPosition(view: additionalPreviewView, position: additionalPreviewFrame.center)
transition.setBounds(view: additionalPreviewView, bounds: CGRect(origin: .zero, size: additionalPreviewFrame.size))
transition.setScale(view: additionalPreviewView, scale: self.isDualCamEnabled ? 1.0 : 0.1)
transition.setAlpha(view: additionalPreviewView, alpha: self.isDualCamEnabled ? 1.0 : 0.0)
if dualCamUpdated && !self.isDualCamEnabled {
Queue.mainQueue().after(0.5) {
additionalPreviewView.resetPlaceholder()
}
case .bottomLeft:
origin = CGPoint(x: 10.0, y: previewFrame.height - 160.0 - 110.0)
if !self.isDualCamEnabled {
origin = origin.offsetBy(dx: -180.0, dy: 0.0)
}
case .bottomRight:
origin = CGPoint(x: previewFrame.width - 160.0 - 10.0, y: previewFrame.height - 160.0 - 110.0)
if !self.isDualCamEnabled {
origin = origin.offsetBy(dx: 180.0, dy: 0.0)
}
}
if let pipTranslation = self.pipTranslation {
origin = origin.offsetBy(dx: pipTranslation.x, dy: pipTranslation.y)
}
let additionalPreviewFrame = CGRect(origin: origin, size: CGSize(width: 160.0, height: 160.0))
transition.setPosition(view: self.additionalPreviewContainerView, position: additionalPreviewFrame.center)
transition.setBounds(view: self.additionalPreviewContainerView, bounds: CGRect(origin: .zero, size: additionalPreviewFrame.size))
self.additionalPreviewContainerView.layer.cornerRadius = additionalPreviewFrame.width / 2.0
transition.setScale(view: self.additionalPreviewContainerView, scale: self.isDualCamEnabled ? 1.0 : 0.1)
transition.setAlpha(view: self.additionalPreviewContainerView, alpha: self.isDualCamEnabled ? 1.0 : 0.0)
if dualCamUpdated && self.isDualCamEnabled {
if self.cameraPosition == .back {
self.additionalPreviewView.resetPlaceholder(front: true)
} else {
self.mainPreviewView.resetPlaceholder(front: false)
}
}
let mainPreviewView: CameraSimplePreviewView
let additionalPreviewView: CameraSimplePreviewView
if self.cameraPosition == .front && self.isDualCamEnabled {
mainPreviewView = self.additionalPreviewView
additionalPreviewView = self.mainPreviewView
} else {
mainPreviewView = self.mainPreviewView
additionalPreviewView = self.additionalPreviewView
}
if mainPreviewView.superview != self.mainPreviewContainerView {
self.mainPreviewContainerView.insertSubview(mainPreviewView, at: 0)
}
if additionalPreviewView.superview != self.additionalPreviewContainerView {
self.additionalPreviewContainerView.insertSubview(additionalPreviewView, at: 0)
}
mainPreviewView.frame = CGRect(origin: .zero, size: previewFrame.size)
additionalPreviewView.frame = CGRect(origin: .zero, size: additionalPreviewFrame.size)
self.previewFrameLeftDimView.isHidden = !isTablet
transition.setFrame(view: self.previewFrameLeftDimView, frame: CGRect(origin: .zero, size: CGSize(width: viewfinderFrame.minX, height: viewfinderFrame.height)))
@@ -1780,6 +1770,7 @@ public class CameraScreen: ViewController {
self.node.animateInFromEditor(toGallery: self.galleryController?.displayNode.supernode != nil)
}
private var didStopCameraCapture = false
func presentGallery(fromGesture: Bool = false) {
if !fromGesture {
self.hapticFeedback.impact(.light)
@@ -1787,20 +1778,20 @@ public class CameraScreen: ViewController {
self.dismissAllTooltips()
var didStopCameraCapture = false
self.didStopCameraCapture = false
let stopCameraCapture = { [weak self] in
guard !didStopCameraCapture, let self else {
guard let self, !self.didStopCameraCapture else {
return
}
didStopCameraCapture = true
self.didStopCameraCapture = true
self.node.pauseCameraCapture()
}
let resumeCameraCapture = { [weak self] in
guard didStopCameraCapture, let self else {
guard let self, self.didStopCameraCapture else {
return
}
didStopCameraCapture = false
self.didStopCameraCapture = false
self.node.resumeCameraCapture()
}