Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
signalapp
GitHub Repository: signalapp/Signal-iOS
Path: blob/main/Signal/src/ViewControllers/HomeView/Chat List/ChatListViewController+Camera.swift
1 views
//
// Copyright 2023 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//

import SignalServiceKit
import SignalUI

extension ChatListViewController: CameraFirstCaptureDelegate {

    @objc
    func showCameraView() {
        presentCameraView()
    }

    func presentCameraView(completion: ((UINavigationController) -> Void)? = nil) {
        // Dismiss any message actions if they're presented
        conversationSplitViewController?.selectedConversationViewController?.dismissMessageContextMenu(animated: true)

        let attachmentLimits = OutgoingAttachmentLimits.currentLimits()

        ows_askForCameraPermissions { cameraAccessGranted in
            guard cameraAccessGranted else {
                Logger.warn("Camera permission denied")
                return
            }
            self.ows_askForMicrophonePermissions { microphoneAccessGranted in
                if !microphoneAccessGranted {
                    // We can still continue without mic permissions, but any captured video will
                    // be silent.
                    Logger.warn("Proceeding with no microphone access.")
                }

                let cameraModal = CameraFirstCaptureNavigationController.cameraFirstModal(
                    hasQuotedReplyDraft: false,
                    attachmentLimits: attachmentLimits,
                    delegate: self,
                )
                cameraModal.modalPresentationStyle = .overFullScreen

                // Defer hiding status bar until modal is fully onscreen
                // to prevent unwanted shifting upwards of the entire presenter VC's view.
                let modalHidesStatusBar = cameraModal.topViewController?.prefersStatusBarHidden ?? false
                if !modalHidesStatusBar {
                    cameraModal.modalPresentationCapturesStatusBarAppearance = true
                }
                self.present(cameraModal, animated: true, completion: {
                    if modalHidesStatusBar {
                        cameraModal.modalPresentationCapturesStatusBarAppearance = true
                        cameraModal.setNeedsStatusBarAppearanceUpdate()
                    }
                    completion?(cameraModal)
                })
            }
        }
    }

    func cameraFirstCaptureSendFlowDidComplete(_ cameraFirstCaptureSendFlow: CameraFirstCaptureSendFlow) {
        dismiss(animated: true)
    }

    func cameraFirstCaptureSendFlowDidCancel(_ cameraFirstCaptureSendFlow: CameraFirstCaptureSendFlow) {
        dismiss(animated: true)
    }
}