Refactoring of PhotoCaptureVC and SendMediaNavController.

Restructure the code to move protocol conformance declarations into the class deceleration and stop doing class extensions.
This commit is contained in:
Igor Solomennikov 2026-05-29 06:24:19 -07:00 committed by GitHub
parent a178545e1e
commit 8b613f8bc1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 38 additions and 71 deletions

View File

@ -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)

View File

@ -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)