From 714008203f805c4114174933d640360ed72f5c16 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Thu, 18 Jan 2024 22:33:55 +0400 Subject: [PATCH] Cherry-pick various fixes --- .../Sources/CameraButtonComponent.swift | 11 +++- .../StoryInteractionGuideComponent.swift | 2 +- .../Sources/VideoMessageCameraScreen.swift | 55 +++++++++---------- 3 files changed, 36 insertions(+), 32 deletions(-) diff --git a/submodules/TelegramUI/Components/CameraButtonComponent/Sources/CameraButtonComponent.swift b/submodules/TelegramUI/Components/CameraButtonComponent/Sources/CameraButtonComponent.swift index ce4d43e4524..326dd928820 100644 --- a/submodules/TelegramUI/Components/CameraButtonComponent/Sources/CameraButtonComponent.swift +++ b/submodules/TelegramUI/Components/CameraButtonComponent/Sources/CameraButtonComponent.swift @@ -7,6 +7,7 @@ public final class CameraButton: Component { let minSize: CGSize? let tag: AnyObject? let isEnabled: Bool + let isExclusive: Bool let action: () -> Void let longTapAction: (() -> Void)? @@ -15,6 +16,7 @@ public final class CameraButton: Component { minSize: CGSize? = nil, tag: AnyObject? = nil, isEnabled: Bool = true, + isExclusive: Bool = true, action: @escaping () -> Void, longTapAction: (() -> Void)? = nil ) { @@ -22,6 +24,7 @@ public final class CameraButton: Component { self.minSize = minSize self.tag = tag self.isEnabled = isEnabled + self.isExclusive = isExclusive self.action = action self.longTapAction = longTapAction } @@ -32,6 +35,7 @@ public final class CameraButton: Component { minSize: self.minSize, tag: tag, isEnabled: self.isEnabled, + isExclusive: self.isExclusive, action: self.action, longTapAction: self.longTapAction ) @@ -50,6 +54,9 @@ public final class CameraButton: Component { if lhs.isEnabled != rhs.isEnabled { return false } + if lhs.isExclusive != rhs.isExclusive { + return false + } return true } @@ -90,8 +97,6 @@ public final class CameraButton: Component { super.init(frame: frame) - self.isExclusiveTouch = true - self.addSubview(self.containerView) self.containerView.addSubview(self.contentView) @@ -175,6 +180,8 @@ public final class CameraButton: Component { self.component = component + self.isExclusiveTouch = component.isExclusive + self.updateScale(transition: transition) self.isEnabled = component.isEnabled self.longTapGestureRecognizer?.isEnabled = component.longTapAction != nil diff --git a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryInteractionGuideComponent.swift b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryInteractionGuideComponent.swift index 08c9c400d7c..62b24ccc464 100644 --- a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryInteractionGuideComponent.swift +++ b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryInteractionGuideComponent.swift @@ -181,7 +181,7 @@ final class StoryInteractionGuideComponent: Component { transition: transition, component: AnyComponent(List(items)), environment: {}, - containerSize: CGSize(width: availableSize.width - sideInset * 2.0, height: availableSize.height) + containerSize: CGSize(width: min(500.0, availableSize.width - sideInset * 2.0), height: availableSize.height) ) let textSpacing: CGFloat = 7.0 diff --git a/submodules/TelegramUI/Components/VideoMessageCameraScreen/Sources/VideoMessageCameraScreen.swift b/submodules/TelegramUI/Components/VideoMessageCameraScreen/Sources/VideoMessageCameraScreen.swift index fe945eb0911..0bcd43ba739 100644 --- a/submodules/TelegramUI/Components/VideoMessageCameraScreen/Sources/VideoMessageCameraScreen.swift +++ b/submodules/TelegramUI/Components/VideoMessageCameraScreen/Sources/VideoMessageCameraScreen.swift @@ -170,6 +170,8 @@ private final class VideoMessageCameraScreenComponent: CombinedComponent { private var resultDisposable = MetaDisposable() var cameraState: CameraState? + + var didDisplayViewOnce = false private let hapticFeedback = HapticFeedback() @@ -355,7 +357,7 @@ private final class VideoMessageCameraScreenComponent: CombinedComponent { } if let controller = component.getController() { - if controller.isSendingImmediately || controller.scheduledLock { + if controller.scheduledLock { showViewOnce = true } if !controller.viewOnceAvailable { @@ -363,6 +365,12 @@ private final class VideoMessageCameraScreenComponent: CombinedComponent { } } + if state.didDisplayViewOnce { + showViewOnce = true + } else if showViewOnce { + state.didDisplayViewOnce = true + } + if !component.isPreviewing { let flipButton = flipButton.update( component: CameraButton( @@ -377,6 +385,7 @@ private final class VideoMessageCameraScreenComponent: CombinedComponent { ) ), minSize: CGSize(width: 44.0, height: 44.0), + isExclusive: false, action: { [weak state] in if let state { state.togglePosition() @@ -672,15 +681,9 @@ public class VideoMessageCameraScreen: ViewController { } self.loadingView.alpha = 0.0 self.additionalPreviewView.removePlaceholder(delay: 0.0) - - Queue.mainQueue().after(0.15) { - self.startRecording.invoke(Void()) - } }) self.idleTimerExtensionDisposable.set(self.context.sharedContext.applicationBindings.pushIdleTimerExtension()) - - self.setupCamera() } deinit { @@ -689,28 +692,19 @@ public class VideoMessageCameraScreen: ViewController { } func withReadyCamera(isFirstTime: Bool = false, _ f: @escaping () -> Void) { - guard let controller = self.controller else { - return - } + let previewReady: Signal if #available(iOS 13.0, *) { - let _ = (combineLatest(queue: Queue.mainQueue(), - self.cameraState.isDualCameraEnabled ? self.additionalPreviewView.isPreviewing : self.mainPreviewView.isPreviewing, - controller.audioSessionReady.get() - ) - |> filter { $0 && $1 } - |> take(1)).startStandalone(next: { _, _ in - f() - }) + previewReady = self.cameraState.isDualCameraEnabled ? self.additionalPreviewView.isPreviewing : self.mainPreviewView.isPreviewing } else { - let _ = (combineLatest(queue: Queue.mainQueue(), - .single(true) |> delay(0.35, queue: Queue.mainQueue()), - controller.audioSessionReady.get() - ) - |> filter { $0 && $1 } - |> take(1)).startStandalone(next: { _, _ in - f() - }) + previewReady = .single(true) |> delay(0.35, queue: Queue.mainQueue()) } + + let _ = (previewReady + |> filter { $0 } + |> take(1) + |> deliverOnMainQueue).startStandalone(next: { _ in + f() + }) } func setupLiveUpload(filePath: String) { @@ -734,7 +728,7 @@ public class VideoMessageCameraScreen: ViewController { self.view.addGestureRecognizer(pinchGestureRecognizer) } - private func setupCamera() { + fileprivate func setupCamera() { guard self.camera == nil else { return } @@ -771,6 +765,10 @@ public class VideoMessageCameraScreen: ViewController { camera.startCapture() self.camera = camera + + Queue.mainQueue().justDispatch { + self.startRecording.invoke(Void()) + } } @objc private func handlePinch(_ gestureRecognizer: UIPinchGestureRecognizer) { @@ -1252,7 +1250,6 @@ public class VideoMessageCameraScreen: ViewController { fileprivate let completion: (EnqueueMessage?, Bool?, Int32?) -> Void private var audioSessionDisposable: Disposable? - fileprivate let audioSessionReady = ValuePromise(false) private let hapticFeedback = HapticFeedback() @@ -1633,7 +1630,7 @@ public class VideoMessageCameraScreen: ViewController { try? AVAudioSession.sharedInstance().setAllowHapticsAndSystemSoundsDuringRecording(true) } if let self { - self.audioSessionReady.set(true) + self.node.setupCamera() } }, deactivate: { _ in return .single(Void())