mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-23 14:45:21 +00:00
Dual camera improvements
This commit is contained in:
@@ -376,10 +376,32 @@ private final class CameraContext {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.queue.after(0.5) {
|
if #available(iOS 13.0, *), let previewView = self.simplePreviewView {
|
||||||
|
if enabled, let secondaryPreviewView = self.secondaryPreviewView {
|
||||||
|
let _ = (combineLatest(previewView.isPreviewing, secondaryPreviewView.isPreviewing)
|
||||||
|
|> map { first, second in
|
||||||
|
return first && second
|
||||||
|
}
|
||||||
|
|> filter { $0 }
|
||||||
|
|> take(1)
|
||||||
|
|> delay(0.1, queue: self.queue)
|
||||||
|
|> deliverOn(self.queue)).start(next: { [weak self] _ in
|
||||||
|
self?.modeChange = .none
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
let _ = (previewView.isPreviewing
|
||||||
|
|> filter { $0 }
|
||||||
|
|> take(1)
|
||||||
|
|> deliverOn(self.queue)).start(next: { [weak self] _ in
|
||||||
|
self?.modeChange = .none
|
||||||
|
})
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
self.queue.after(0.4) {
|
||||||
self.modeChange = .none
|
self.modeChange = .none
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private func configure(_ f: () -> Void) {
|
private func configure(_ f: () -> Void) {
|
||||||
self.session.session.beginConfiguration()
|
self.session.session.beginConfiguration()
|
||||||
|
|||||||
@@ -59,7 +59,22 @@ public class CameraSimplePreviewView: UIView {
|
|||||||
self.placeholderView.image = additional ? CameraSimplePreviewView.lastAdditionalStateImage() : CameraSimplePreviewView.lastStateImage()
|
self.placeholderView.image = additional ? CameraSimplePreviewView.lastAdditionalStateImage() : CameraSimplePreviewView.lastStateImage()
|
||||||
self.addSubview(self.placeholderView)
|
self.addSubview(self.placeholderView)
|
||||||
|
|
||||||
self.resetPlaceholder()
|
if !additional {
|
||||||
|
if #available(iOS 13.0, *) {
|
||||||
|
self.previewingDisposable = (self.isPreviewing
|
||||||
|
|> filter { $0 }
|
||||||
|
|> take(1)
|
||||||
|
|> deliverOnMainQueue).start(next: { [weak self] _ in
|
||||||
|
self?.removePlaceholder(delay: 0.15)
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
Queue.mainQueue().after(0.35) {
|
||||||
|
self.removePlaceholder(delay: 0.15)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
self.placeholderView.alpha = 1.0
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
required init?(coder: NSCoder) {
|
required init?(coder: NSCoder) {
|
||||||
@@ -76,28 +91,18 @@ public class CameraSimplePreviewView: UIView {
|
|||||||
self.placeholderView.frame = self.bounds.insetBy(dx: -1.0, dy: -1.0)
|
self.placeholderView.frame = self.bounds.insetBy(dx: -1.0, dy: -1.0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public func removePlaceholder(delay: Double = 0.0) {
|
||||||
|
UIView.animate(withDuration: 0.3, delay: delay) {
|
||||||
|
self.placeholderView.alpha = 0.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public func resetPlaceholder() {
|
public func resetPlaceholder() {
|
||||||
guard self.placeholderView.alpha == 0.0 else {
|
guard self.placeholderView.alpha == 0.0 else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
self.placeholderView.image = self.additional ? CameraSimplePreviewView.lastAdditionalStateImage() : CameraSimplePreviewView.lastStateImage()
|
self.placeholderView.image = self.additional ? CameraSimplePreviewView.lastAdditionalStateImage() : CameraSimplePreviewView.lastStateImage()
|
||||||
self.placeholderView.alpha = 1.0
|
self.placeholderView.alpha = 1.0
|
||||||
if #available(iOS 13.0, *) {
|
|
||||||
self.previewingDisposable = (self.isPreviewing
|
|
||||||
|> filter { $0 }
|
|
||||||
|> take(1)
|
|
||||||
|> deliverOnMainQueue).start(next: { [weak self] _ in
|
|
||||||
UIView.animate(withDuration: 0.3, delay: 0.15) {
|
|
||||||
self?.placeholderView.alpha = 0.0
|
|
||||||
}
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
Queue.mainQueue().after(0.5) {
|
|
||||||
UIView.animate(withDuration: 0.3) {
|
|
||||||
self.placeholderView.alpha = 0.0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private var _videoPreviewLayer: AVCaptureVideoPreviewLayer?
|
private var _videoPreviewLayer: AVCaptureVideoPreviewLayer?
|
||||||
|
|||||||
@@ -877,6 +877,7 @@ public class CameraScreen: ViewController {
|
|||||||
|
|
||||||
private var changingPositionDisposable: Disposable?
|
private var changingPositionDisposable: Disposable?
|
||||||
private var isDualCamEnabled = false
|
private var isDualCamEnabled = false
|
||||||
|
private var appliedDualCam = false
|
||||||
private var cameraPosition: Camera.Position = .back
|
private var cameraPosition: Camera.Position = .back
|
||||||
|
|
||||||
private let completion = ActionSlot<Signal<CameraScreen.Result, NoError>>()
|
private let completion = ActionSlot<Signal<CameraScreen.Result, NoError>>()
|
||||||
@@ -1069,6 +1070,10 @@ public class CameraScreen: ViewController {
|
|||||||
previewSnapshotView.removeFromSuperview()
|
previewSnapshotView.removeFromSuperview()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if self.isDualCamEnabled {
|
||||||
|
self.additionalPreviewView?.removePlaceholder()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -1115,6 +1120,8 @@ public class CameraScreen: ViewController {
|
|||||||
if let self {
|
if let self {
|
||||||
let previousPosition = self.cameraPosition
|
let previousPosition = self.cameraPosition
|
||||||
self.cameraPosition = state.position
|
self.cameraPosition = state.position
|
||||||
|
|
||||||
|
let dualCamWasEnabled = self.isDualCamEnabled
|
||||||
self.isDualCamEnabled = state.isDualCamEnabled
|
self.isDualCamEnabled = state.isDualCamEnabled
|
||||||
|
|
||||||
if self.isDualCamEnabled && previousPosition != state.position, let additionalPreviewView = self.additionalPreviewView {
|
if self.isDualCamEnabled && previousPosition != state.position, let additionalPreviewView = self.additionalPreviewView {
|
||||||
@@ -1128,6 +1135,9 @@ public class CameraScreen: ViewController {
|
|||||||
self.requestUpdateLayout(hasAppeared: false, transition: .immediate)
|
self.requestUpdateLayout(hasAppeared: false, transition: .immediate)
|
||||||
CATransaction.commit()
|
CATransaction.commit()
|
||||||
} else {
|
} else {
|
||||||
|
if !dualCamWasEnabled && self.isDualCamEnabled {
|
||||||
|
|
||||||
|
}
|
||||||
self.requestUpdateLayout(hasAppeared: false, transition: .spring(duration: 0.4))
|
self.requestUpdateLayout(hasAppeared: false, transition: .spring(duration: 0.4))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1599,8 +1609,10 @@ public class CameraScreen: ViewController {
|
|||||||
transition.setFrame(view: self.currentPreviewView, frame: CGRect(origin: .zero, size: previewFrame.size))
|
transition.setFrame(view: self.currentPreviewView, frame: CGRect(origin: .zero, size: previewFrame.size))
|
||||||
transition.setFrame(view: self.previewBlurView, 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 {
|
if let additionalPreviewView = self.currentAdditionalPreviewView as? CameraSimplePreviewView {
|
||||||
|
let dualCamUpdated = self.appliedDualCam != self.isDualCamEnabled
|
||||||
|
self.appliedDualCam = self.isDualCamEnabled
|
||||||
|
|
||||||
additionalPreviewView.layer.cornerRadius = 80.0
|
additionalPreviewView.layer.cornerRadius = 80.0
|
||||||
|
|
||||||
var origin: CGPoint
|
var origin: CGPoint
|
||||||
@@ -1632,15 +1644,17 @@ public class CameraScreen: ViewController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let additionalPreviewFrame = CGRect(origin: origin, size: CGSize(width: 160.0, height: 160.0))
|
let additionalPreviewFrame = CGRect(origin: origin, size: CGSize(width: 160.0, height: 160.0))
|
||||||
transition.setPosition(view: additionalPreviewView, position: additionalPreviewFrame.center, completion: { _ in
|
transition.setPosition(view: additionalPreviewView, position: additionalPreviewFrame.center)
|
||||||
if !self.isDualCamEnabled {
|
|
||||||
additionalPreviewView.resetPlaceholder()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
transition.setBounds(view: additionalPreviewView, bounds: CGRect(origin: .zero, size: additionalPreviewFrame.size))
|
transition.setBounds(view: additionalPreviewView, bounds: CGRect(origin: .zero, size: additionalPreviewFrame.size))
|
||||||
|
|
||||||
transition.setScale(view: additionalPreviewView, scale: self.isDualCamEnabled ? 1.0 : 0.1)
|
transition.setScale(view: additionalPreviewView, scale: self.isDualCamEnabled ? 1.0 : 0.1)
|
||||||
transition.setAlpha(view: additionalPreviewView, alpha: self.isDualCamEnabled ? 1.0 : 0.0)
|
transition.setAlpha(view: additionalPreviewView, alpha: self.isDualCamEnabled ? 1.0 : 0.0)
|
||||||
|
|
||||||
|
if dualCamUpdated && !self.isDualCamEnabled {
|
||||||
|
Queue.mainQueue().after(0.5) {
|
||||||
|
additionalPreviewView.resetPlaceholder()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.previewFrameLeftDimView.isHidden = !isTablet
|
self.previewFrameLeftDimView.isHidden = !isTablet
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ public final class StoryContentContextImpl: StoryContentContext {
|
|||||||
let additionalPeerData: StoryContentContextState.AdditionalPeerData
|
let additionalPeerData: StoryContentContextState.AdditionalPeerData
|
||||||
if let cachedPeerDataView = views.views[PostboxViewKey.cachedPeerData(peerId: peerId)] as? CachedPeerDataView, let cachedUserData = cachedPeerDataView.cachedPeerData as? CachedUserData {
|
if let cachedPeerDataView = views.views[PostboxViewKey.cachedPeerData(peerId: peerId)] as? CachedPeerDataView, let cachedUserData = cachedPeerDataView.cachedPeerData as? CachedUserData {
|
||||||
let _ = cachedUserData
|
let _ = cachedUserData
|
||||||
additionalPeerData = StoryContentContextState.AdditionalPeerData(areVoiceMessagesAvailable: false) //cachedUserData.voiceMessagesAvailable)
|
additionalPeerData = StoryContentContextState.AdditionalPeerData(areVoiceMessagesAvailable: cachedUserData.voiceMessagesAvailable)
|
||||||
} else {
|
} else {
|
||||||
additionalPeerData = StoryContentContextState.AdditionalPeerData(areVoiceMessagesAvailable: true)
|
additionalPeerData = StoryContentContextState.AdditionalPeerData(areVoiceMessagesAvailable: true)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user