From fe528f27a1f5101055fa81bce91a9b4a0b6fb19a Mon Sep 17 00:00:00 2001 From: Igor Solomennikov Date: Fri, 4 Mar 2022 19:11:18 -0800 Subject: [PATCH] Fix incorrect camera zoom behavior on devices with UW and W cameras. Such devices include iPhone 11, iPhone 12/13/mini. The fix is to use a virtual "dual wide camera" device, similarly to how "triple camera" and "dual camera" devices are already in use. --- .../ViewControllers/Photos/PhotoCapture.swift | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/Signal/src/ViewControllers/Photos/PhotoCapture.swift b/Signal/src/ViewControllers/Photos/PhotoCapture.swift index baf70c2556..44e2f8d5bc 100644 --- a/Signal/src/ViewControllers/Photos/PhotoCapture.swift +++ b/Signal/src/ViewControllers/Photos/PhotoCapture.swift @@ -399,6 +399,7 @@ class PhotoCapture: NSObject { enum CameraSystem { case wide // Single-camera devices. case dual // W + T + case dualWide // UW + W case triple // UW + W + T } @@ -426,8 +427,13 @@ class PhotoCapture: NSObject { let avTypes = captureOutput.imageOutput.availableRearDeviceTypes // No iOS 12 device can have a triple camera system. - if #available(iOS 13, *), avTypes.contains(.builtInTripleCamera) { - return .triple + if #available(iOS 13, *) { + if avTypes.contains(.builtInTripleCamera) { + return .triple + } + if avTypes.contains(.builtInUltraWideCamera) { + return .dualWide + } } if avTypes.contains(.builtInDualCamera) { return .dual @@ -443,6 +449,12 @@ class PhotoCapture: NSObject { case .dual: return .builtInDualCamera + case .dualWide: + if #available(iOS 13, *) { + return .builtInDualWideCamera + } + fallthrough + case .triple: if #available(iOS 13, *) { return .builtInTripleCamera @@ -1330,7 +1342,7 @@ class PhotoCaptureOutputAdaptee: NSObject, ImageCaptureOutput { return [] } - if let multiCameraDevice = deviceMap[.builtInTripleCamera] ?? deviceMap[.builtInDualCamera] { + if let multiCameraDevice = deviceMap[.builtInTripleCamera] ?? deviceMap[.builtInDualWideCamera] ?? deviceMap[.builtInDualCamera] { return multiCameraDevice.virtualDeviceSwitchOverVideoZoomFactors.map { CGFloat(truncating: $0) } } return [] @@ -1385,7 +1397,7 @@ class PhotoCaptureOutputAdaptee: NSObject, ImageCaptureOutput { private func availableDevices(forPosition position: AVCaptureDevice.Position) -> [AVCaptureDevice.DeviceType: AVCaptureDevice] { var queryDeviceTypes: [AVCaptureDevice.DeviceType] = [ .builtInWideAngleCamera, .builtInTelephotoCamera, .builtInDualCamera ] if #available(iOS 13, *) { - queryDeviceTypes.append(contentsOf: [ .builtInUltraWideCamera, .builtInTripleCamera ]) + queryDeviceTypes.append(contentsOf: [ .builtInUltraWideCamera, .builtInDualWideCamera, .builtInTripleCamera ]) } let session = AVCaptureDevice.DiscoverySession(deviceTypes: queryDeviceTypes, mediaType: .video, position: position) let deviceMap = session.devices.reduce(into: [AVCaptureDevice.DeviceType: AVCaptureDevice]()) { deviceMap, device in