diff --git a/Signal/src/ViewControllers/Photos/PhotoCaptureViewController.swift b/Signal/src/ViewControllers/Photos/PhotoCaptureViewController.swift index a85b333669..253d819f2d 100644 --- a/Signal/src/ViewControllers/Photos/PhotoCaptureViewController.swift +++ b/Signal/src/ViewControllers/Photos/PhotoCaptureViewController.swift @@ -4,13 +4,11 @@ // import AVFoundation -import Foundation import LibSignalClient import Lottie import Photos import SignalServiceKit import SignalUI -import UIKit protocol PhotoCaptureViewControllerDelegate: AnyObject { func photoCaptureViewControllerDidFinish(_ photoCaptureViewController: PhotoCaptureViewController) @@ -36,7 +34,10 @@ protocol PhotoCaptureViewControllerDataSource: AnyObject { func addMedia(attachment: PreviewableAttachment) } -class PhotoCaptureViewController: OWSViewController, OWSNavigationChildController { +class PhotoCaptureViewController: OWSViewController, OWSNavigationChildController, SheetDismissalDelegate, + CameraCaptureSessionDelegate, CameraZoomSelectionControlDelegate, InteractiveDismissDelegate, + LinkPreviewAttachmentViewControllerDelegate, QRCodeSampleBufferScannerDelegate, TextStoryComposerViewDelegate +{ private let attachmentLimits: OutgoingAttachmentLimits init(attachmentLimits: OutgoingAttachmentLimits) { @@ -755,11 +756,8 @@ class PhotoCaptureViewController: OWSViewController, OWSNavigationChildControlle updateOrientation() } } -} -// MARK: - Text Editor - -extension PhotoCaptureViewController { + // MARK: - Text Editor private func initializeTextEditorUIIfNecessary() { guard !textEditorUIInitialized else { return } @@ -1043,9 +1041,8 @@ extension PhotoCaptureViewController { guard composerMode == .text else { return } setComposerMode(.camera, animated: true) } -} -extension PhotoCaptureViewController: TextStoryComposerViewDelegate { + // MARK: - TextStoryComposerViewDelegate fileprivate func textStoryComposerDidBeginEditing(_ textStoryComposer: TextStoryComposerView) { updateBottomBarVisibility(animated: true) @@ -1060,9 +1057,8 @@ extension PhotoCaptureViewController: TextStoryComposerViewDelegate { fileprivate func textStoryComposerDidChange(_ textStoryComposer: TextStoryComposerView) { bottomBar.proceedButton.isEnabled = !textStoryComposer.isEmpty } -} -extension PhotoCaptureViewController: LinkPreviewAttachmentViewControllerDelegate { + // MARK: - LinkPreviewAttachmentViewControllerDelegate func linkPreviewAttachmentViewController( _ viewController: LinkPreviewAttachmentViewController, @@ -1071,11 +1067,8 @@ extension PhotoCaptureViewController: LinkPreviewAttachmentViewControllerDelegat textStoryComposerView.linkPreviewDraft = linkPreview viewController.dismiss(animated: true) } -} -// MARK: - Button Actions - -extension PhotoCaptureViewController { + // MARK: - Button Actions @objc private func didTapClose() { @@ -1142,11 +1135,8 @@ extension PhotoCaptureViewController { guard let newComposerMode = ComposerMode(rawValue: bottomBar.contentTypeSelectionControl.selectedSegmentIndex) else { return } setComposerMode(newComposerMode, animated: true) } -} -// MARK: - Camera Gesture Recognizers - -extension PhotoCaptureViewController { + // MARK: - Camera Gesture Recognizers private func configureCameraGestures() { previewView.addGestureRecognizer(UIPinchGestureRecognizer(target: self, action: #selector(didPinchZoom(pinchGesture:)))) @@ -1213,11 +1203,8 @@ extension PhotoCaptureViewController { guard bottomBar.captureControl.state == .initial else { return } setComposerMode(.text, animated: true) } -} -// MARK: - Tap to Focus - -extension PhotoCaptureViewController { + // MARK: - Tap to Focus private func positionTapToFocusView(center: CGPoint) { tapToFocusCenterXConstraint.constant = center.x @@ -1238,11 +1225,8 @@ extension PhotoCaptureViewController { tapToFocusView.play(toProgress: 1.0) } -} -// MARK: - Photo Capture - -extension PhotoCaptureViewController { + // MARK: - Photo Capture private func setupPhotoCapture() { bottomBar.captureControl.delegate = cameraCaptureSession @@ -1298,9 +1282,8 @@ extension PhotoCaptureViewController { sideBar.flashModeButton.setFlashMode(cameraCaptureSession.flashMode, animated: animated) } } -} -extension PhotoCaptureViewController: InteractiveDismissDelegate { + // MARK: - InteractiveDismissDelegate func interactiveDismissDidBegin(_ interactiveDismiss: UIPercentDrivenInteractiveTransition) { view.backgroundColor = .clear @@ -1319,9 +1302,8 @@ extension PhotoCaptureViewController: InteractiveDismissDelegate { func interactiveDismissDidCancel(_ interactiveDismiss: UIPercentDrivenInteractiveTransition) { view.backgroundColor = Theme.darkThemeBackgroundColor } -} -extension PhotoCaptureViewController: CameraZoomSelectionControlDelegate { + // MARK: - CameraZoomSelectionControlDelegate func cameraZoomControl(_ cameraZoomControl: CameraZoomSelectionControl, didSelect camera: CameraCaptureSession.CameraType) { let position: AVCaptureDevice.Position = cameraZoomControl == frontCameraZoomControl ? .front : .back @@ -1331,11 +1313,9 @@ extension PhotoCaptureViewController: CameraZoomSelectionControlDelegate { func cameraZoomControl(_ cameraZoomControl: CameraZoomSelectionControl, didChangeZoomFactor zoomFactor: CGFloat) { cameraCaptureSession.changeVisibleZoomFactor(to: zoomFactor, animated: true) } -} -// MARK: - QRCodeSampleBufferScannerDelegate + // MARK: - QRCodeSampleBufferScannerDelegate -extension PhotoCaptureViewController: QRCodeSampleBufferScannerDelegate { var shouldProcessQRCodes: Bool { _shouldProcessQRCodes.get() } @@ -1468,22 +1448,17 @@ extension PhotoCaptureViewController: QRCodeSampleBufferScannerDelegate { dismissalDelegate: self, ) } -} -// MARK: - SheetDismissalDelegate + // MARK: - SheetDismissalDelegate -extension PhotoCaptureViewController: SheetDismissalDelegate { func didDismissPresentedSheet() { // Allow another QR code to be scanned qrCodeScanned = false } -} -// MARK: - CameraCaptureSessionDelegate + // MARK: - CameraCaptureSessionDelegate -extension PhotoCaptureViewController: CameraCaptureSessionDelegate { - - // MARK: - Photo + // MARK: Photo func cameraCaptureSessionDidStart(_ session: CameraCaptureSession) { let captureFeedbackView = UIView() @@ -1533,7 +1508,7 @@ extension PhotoCaptureViewController: CameraCaptureSessionDelegate { delegate?.photoCaptureViewControllerDidTryToCaptureTooMany(self) } - // MARK: - Video + // MARK: Video func cameraCaptureSessionWillStartVideoRecording(_ session: CameraCaptureSession) { setIsRecordingVideo(true, animated: true) diff --git a/Signal/src/ViewControllers/Photos/SendMediaNavigationController.swift b/Signal/src/ViewControllers/Photos/SendMediaNavigationController.swift index df4d36a918..d86f952cf6 100644 --- a/Signal/src/ViewControllers/Photos/SendMediaNavigationController.swift +++ b/Signal/src/ViewControllers/Photos/SendMediaNavigationController.swift @@ -73,7 +73,10 @@ class CameraFirstCaptureNavigationController: SendMediaNavigationController { } } -class SendMediaNavigationController: OWSNavigationController { +class SendMediaNavigationController: OWSNavigationController, AttachmentApprovalViewControllerDelegate, + AttachmentApprovalViewControllerDataSource, PhotoCaptureViewControllerDelegate, PhotoCaptureViewControllerDataSource, + PHPickerViewControllerDelegate, StickerPickerSheetDelegate, UIAdaptivePresentationControllerDelegate +{ fileprivate var requiresContactPickerToProceed: Bool { false @@ -269,11 +272,6 @@ class SendMediaNavigationController: OWSNavigationController { self.presentActionSheet(alert) } } -} - -extension SendMediaNavigationController { - - // MARK: - Too Many func showTooManySelectedToast() { let toastFormat = OWSLocalizedString( @@ -286,9 +284,8 @@ extension SendMediaNavigationController { let toastController = ToastController(text: toastText) toastController.presentToastView(from: .bottom, of: view, inset: view.layoutMargins.bottom + 10) } -} -extension SendMediaNavigationController: PhotoCaptureViewControllerDelegate { + // MARK: - PhotoCaptureViewControllerDelegate func photoCaptureViewControllerDidFinish(_ photoCaptureViewController: PhotoCaptureViewController) { owsPrecondition(numberOfMediaItems > 0) @@ -373,9 +370,8 @@ extension SendMediaNavigationController: PhotoCaptureViewControllerDelegate { func photoCaptureViewControllerCanShowTextEditor(_ photoCaptureViewController: PhotoCaptureViewController) -> Bool { return canSendToStories } -} -extension SendMediaNavigationController: PhotoCaptureViewControllerDataSource { + // MARK: - PhotoCaptureViewControllerDataSource var numberOfMediaItems: Int { return self.pendingAttachments.count @@ -387,9 +383,9 @@ extension SendMediaNavigationController: PhotoCaptureViewControllerDataSource { approvalItem: AttachmentApprovalItem(attachment: attachment, canSave: true), )) } -} -extension SendMediaNavigationController: PHPickerViewControllerDelegate { + // MARK: - PHPickerViewControllerDelegate + private struct PHPickerResultsLoadResult { let resolvablePendingAttachments: [() async throws -> PendingAttachment] let didAddAttachments: Bool @@ -524,17 +520,8 @@ extension SendMediaNavigationController: PHPickerViewControllerDelegate { pickerViewController: picker, ) } -} -extension SendMediaNavigationController: UIAdaptivePresentationControllerDelegate { - func presentationControllerDidDismiss(_ presentationController: UIPresentationController) { - // The user swiped the photo picker down - self.sendMediaNavDelegate?.sendMediaNavDidCancel(self) - } -} - -private extension SendMediaNavigationController { - func showApprovalAfterProcessing( + fileprivate func showApprovalAfterProcessing( resolvablePendingAttachments: [() async throws -> PendingAttachment], pickerViewController: PHPickerViewController, ) { @@ -571,9 +558,15 @@ private extension SendMediaNavigationController { }, ) } -} -extension SendMediaNavigationController: AttachmentApprovalViewControllerDelegate { + // MARK: - UIAdaptivePresentationControllerDelegate + + func presentationControllerDidDismiss(_ presentationController: UIPresentationController) { + // The user swiped the photo picker down + self.sendMediaNavDelegate?.sendMediaNavDidCancel(self) + } + + // MARK: - AttachmentApprovalViewControllerDelegate func attachmentApproval(_ attachmentApproval: AttachmentApprovalViewController, didChangeMessageBody newMessageBody: MessageBody?) { sendMediaNavDelegate?.sendMediaNav(self, didChangeMessageBody: newMessageBody) @@ -638,9 +631,8 @@ extension SendMediaNavigationController: AttachmentApprovalViewControllerDelegat // the picker for _additional_ photos. present(vc, animated: true) } -} -extension SendMediaNavigationController: AttachmentApprovalViewControllerDataSource { + // MARK: - AttachmentApprovalViewControllerDataSource var attachmentApprovalTextInputContextIdentifier: String? { sendMediaNavDataSource?.sendMediaNavTextInputContextIdentifier @@ -657,9 +649,9 @@ extension SendMediaNavigationController: AttachmentApprovalViewControllerDataSou func attachmentApprovalMentionCacheInvalidationKey() -> String { sendMediaNavDataSource?.sendMediaNavMentionCacheInvalidationKey() ?? UUID().uuidString } -} -extension SendMediaNavigationController: StickerPickerSheetDelegate { + // MARK: - StickerPickerSheetDelegate + func makeManageStickersViewController(for stickerPickerSheet: StickerPickerSheet) -> UIViewController { let manageStickersView = ManageStickersViewController() let navigationController = OWSNavigationController(rootViewController: manageStickersView)