* Reformat

* Prettier: Print Width 140

* SwiftFormat: Disable `organizeDeclarations`

* React Helpers -> React Utils

* Use bundle exec for pods

* Disable Hermes in Example

* Create clean.sh

* Update package.json

* Re-generate lockfiles

* Add bundle install step to bootstrap
This commit is contained in:
Marc Rousavy
2021-03-31 15:43:29 +02:00
committed by GitHub
parent 67b72682b4
commit 7c33839e36
24 changed files with 993 additions and 996 deletions

View File

@@ -5,8 +5,7 @@
--disable andOperator
--disable redundantReturn
--disable wrapMultilineStatementBraces
--enable organizeDeclarations
--disable organizeDeclarations
--enable markTypes

View File

@@ -6,8 +6,7 @@
// Copyright © 2020 Facebook. All rights reserved.
//
#ifndef CameraBridge_h
#define CameraBridge_h
#pragma once
#import <Foundation/Foundation.h>
#import <React/RCTViewManager.h>
@@ -16,5 +15,3 @@
@interface CameraBridge: RCTViewManager
@end
#endif /* CameraBridge_h */

View File

@@ -14,8 +14,6 @@ enum PermissionError: String {
case microphone = "microphone-permission-denied"
case camera = "camera-permission-denied"
// MARK: Internal
var code: String {
return rawValue
}
@@ -39,8 +37,6 @@ enum ParameterError {
case unsupportedInput(inputDescriptor: String)
case invalidCombination(provided: String, missing: String)
// MARK: Internal
var code: String {
switch self {
case .invalid:
@@ -84,8 +80,6 @@ enum DeviceError: String {
case focusNotSupported = "focus-not-supported"
case notAvailableOnSimulator = "camera-not-available-on-simulator"
// MARK: Internal
var code: String {
return rawValue
}
@@ -120,8 +114,6 @@ enum FormatError {
case invalidFormat
case invalidPreset(preset: String)
// MARK: Internal
var code: String {
switch self {
case .invalidFormat:
@@ -156,8 +148,6 @@ enum SessionError {
case audioSessionSetupFailed(reason: String)
case audioInUseByOtherApp
// MARK: Internal
var code: String {
switch self {
case .cameraNotReady:
@@ -192,8 +182,6 @@ enum CaptureError {
case invalidPhotoCodec
case unknown(message: String? = nil)
// MARK: Internal
var code: String {
switch self {
case .invalidPhotoFormat:
@@ -238,8 +226,6 @@ enum CaptureError {
enum SystemError: String {
case noManager = "no-camera-manager"
// MARK: Internal
var code: String {
return rawValue
}
@@ -264,8 +250,6 @@ enum CameraError: Error {
case system(_ id: SystemError)
case unknown(message: String? = nil)
// MARK: Internal
var code: String {
switch self {
case let .permission(id: id):

View File

@@ -11,8 +11,6 @@ import AVFoundation
// MARK: - TakePhotoOptions
struct TakePhotoOptions {
// MARK: Lifecycle
init(fromDictionary dictionary: NSDictionary) {
if let videoCodec = dictionary.value(forKey: "videoCodec") as? String {
self.videoCodec = AVVideoCodecType(withString: videoCodec)
@@ -20,8 +18,6 @@ struct TakePhotoOptions {
qualityPrioritization = dictionary.value(forKey: "qualityPrioritization") as? String
}
// MARK: Internal
var videoCodec: AVVideoCodecType?
var qualityPrioritization: String?
}

View File

@@ -32,11 +32,77 @@ private let propsThatRequireDeviceReconfiguration = ["fps",
// MARK: - CameraView
final class CameraView: UIView {
// MARK: Lifecycle
public final class CameraView: UIView {
// pragma MARK: React Properties
// props that require reconfiguring
@objc var cameraId: NSString?
@objc var enableDepthData = false
@objc var enableHighResolutionCapture: NSNumber? // nullable bool
@objc var enablePortraitEffectsMatteDelivery = false
@objc var preset: String?
// props that require format reconfiguring
@objc var format: NSDictionary?
@objc var fps: NSNumber?
@objc var hdr: NSNumber? // nullable bool
@objc var lowLightBoost: NSNumber? // nullable bool
@objc var colorSpace: NSString?
// other props
@objc var isActive = false
@objc var torch = "off"
@objc var zoom: NSNumber = 0.0 // in percent
// events
@objc var onInitialized: RCTDirectEventBlock?
@objc var onError: RCTDirectEventBlock?
// zoom
@objc var enableZoomGesture = false {
didSet {
if enableZoomGesture {
addPinchGestureRecognizer()
} else {
removePinchGestureRecognizer()
}
}
}
// pragma MARK: Internal Properties
internal var isReady = false
/// The serial execution queue for the camera preview layer (input stream) as well as output processing (take photo and record video)
internal let queue = DispatchQueue(label: "com.mrousavy.camera-queue", qos: .userInteractive, attributes: [], autoreleaseFrequency: .inherit, target: nil)
// Capture Session
internal let captureSession = AVCaptureSession()
// Inputs
internal var videoDeviceInput: AVCaptureDeviceInput?
internal var audioDeviceInput: AVCaptureDeviceInput?
// Outputs
internal var photoOutput: AVCapturePhotoOutput?
internal var movieOutput: AVCaptureMovieFileOutput?
// CameraView+TakePhoto
internal var photoCaptureDelegates: [PhotoCaptureDelegate] = []
// CameraView+RecordVideo
internal var recordingDelegateResolver: RCTPromiseResolveBlock?
internal var recordingDelegateRejecter: RCTPromiseRejectBlock?
// CameraView+Zoom
internal var pinchGestureRecognizer: UIPinchGestureRecognizer?
internal var pinchScaleOffset: CGFloat = 1.0
var isRunning: Bool {
return captureSession.isRunning
}
/// Convenience wrapper to get layer as its statically known type.
var videoPreviewLayer: AVCaptureVideoPreviewLayer {
// swiftlint:disable force_cast
return layer as! AVCaptureVideoPreviewLayer
}
override public class var layerClass: AnyClass {
return AVCaptureVideoPreviewLayer.self
}
// pragma MARK: Setup
override init(frame: CGRect) {
override public init(frame: CGRect) {
super.init(frame: frame)
videoPreviewLayer.session = captureSession
videoPreviewLayer.videoGravity = .resizeAspectFill
@@ -80,82 +146,14 @@ final class CameraView: UIView {
fatalError("init(coder:) is not implemented.")
}
// MARK: Internal
override class var layerClass: AnyClass {
return AVCaptureVideoPreviewLayer.self
}
// pragma MARK: Exported Properties
// props that require reconfiguring
@objc var cameraId: NSString?
@objc var enableDepthData = false
@objc var enableHighResolutionCapture: NSNumber? // nullable bool
@objc var enablePortraitEffectsMatteDelivery = false
@objc var preset: String?
// props that require format reconfiguring
@objc var format: NSDictionary?
@objc var fps: NSNumber?
@objc var hdr: NSNumber? // nullable bool
@objc var lowLightBoost: NSNumber? // nullable bool
@objc var colorSpace: NSString?
// other props
@objc var isActive = false
@objc var torch = "off"
@objc var zoom: NSNumber = 0.0 // in percent
// events
@objc var onInitialized: RCTDirectEventBlock?
@objc var onError: RCTDirectEventBlock?
// pragma MARK: Private Properties
internal var isReady = false
/// The serial execution queue for the camera preview layer (input stream) as well as output processing (take photo and record video)
internal let queue = DispatchQueue(label: "com.mrousavy.camera-queue", qos: .userInteractive, attributes: [], autoreleaseFrequency: .inherit, target: nil)
// Capture Session
internal let captureSession = AVCaptureSession()
// Inputs
internal var videoDeviceInput: AVCaptureDeviceInput?
internal var audioDeviceInput: AVCaptureDeviceInput?
// Outputs
internal var photoOutput: AVCapturePhotoOutput?
internal var movieOutput: AVCaptureMovieFileOutput?
// CameraView+TakePhoto
internal var photoCaptureDelegates: [PhotoCaptureDelegate] = []
// CameraView+RecordVideo
internal var recordingDelegateResolver: RCTPromiseResolveBlock?
internal var recordingDelegateRejecter: RCTPromiseRejectBlock?
// CameraView+Zoom
internal var pinchGestureRecognizer: UIPinchGestureRecognizer?
internal var pinchScaleOffset: CGFloat = 1.0
@objc var enableZoomGesture = false {
didSet {
if enableZoomGesture {
addPinchGestureRecognizer()
} else {
removePinchGestureRecognizer()
}
}
}
var isRunning: Bool {
return captureSession.isRunning
}
/// Convenience wrapper to get layer as its statically known type.
var videoPreviewLayer: AVCaptureVideoPreviewLayer {
// swiftlint:disable force_cast
return layer as! AVCaptureVideoPreviewLayer
}
override func removeFromSuperview() {
override public func removeFromSuperview() {
ReactLogger.log(level: .info, message: "Removing Camera View...")
captureSession.stopRunning()
super.removeFromSuperview()
}
// pragma MARK: Props updating
override final func didSetProps(_ changedProps: [String]!) {
override public final func didSetProps(_ changedProps: [String]!) {
ReactLogger.log(level: .info, message: "Updating \(changedProps.count) prop(s)...")
let shouldReconfigure = changedProps.contains { propsThatRequireReconfiguration.contains($0) }
let shouldReconfigureFormat = shouldReconfigure || changedProps.contains("format")

View File

@@ -6,7 +6,7 @@
// Copyright © 2020 Facebook. All rights reserved.
//
#import "CameraBridge.h"
#import <Foundation/Foundation.h>
#import <React/RCTViewManager.h>
@interface RCT_EXTERN_REMAP_MODULE(CameraView, CameraViewManager, RCTViewManager)

View File

@@ -11,8 +11,6 @@ import Foundation
@objc(CameraViewManager)
final class CameraViewManager: RCTViewManager {
// MARK: Internal
override var methodQueue: DispatchQueue! {
return DispatchQueue.main
}

View File

@@ -13,16 +13,12 @@ private var delegatesReferences: [NSObject] = []
// MARK: - PhotoCaptureDelegate
class PhotoCaptureDelegate: NSObject, AVCapturePhotoCaptureDelegate {
// MARK: Lifecycle
required init(promise: Promise) {
self.promise = promise
super.init()
delegatesReferences.append(self)
}
// MARK: Internal
func photoOutput(_: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
defer {
delegatesReferences.removeAll(where: { $0 == self })

View File

@@ -14,15 +14,11 @@ import Foundation
* Represents a JavaScript Promise instance. `reject()` and `resolve()` should only be called once.
*/
class Promise {
// MARK: Lifecycle
init(resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
self.resolver = resolver
self.rejecter = rejecter
}
// MARK: Internal
func reject(error: CameraError, cause: NSError?) {
rejecter(error.code, error.message, cause)
}

View File

@@ -17,8 +17,6 @@ private var delegateReferences: [NSObject] = []
// MARK: - RecordingDelegateWithCallback
class RecordingDelegateWithCallback: NSObject, AVCaptureFileOutputRecordingDelegate {
// MARK: Lifecycle
init(callback: @escaping RCTResponseSenderBlock, resetTorchMode: @escaping () -> Void) {
self.callback = callback
self.resetTorchMode = resetTorchMode
@@ -26,8 +24,6 @@ class RecordingDelegateWithCallback: NSObject, AVCaptureFileOutputRecordingDeleg
delegateReferences.append(self)
}
// MARK: Internal
func fileOutput(_ output: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from _: [AVCaptureConnection], error: Error?) {
defer {
self.resetTorchMode()

View File

@@ -138,7 +138,7 @@
B887516125E0102000DB86D6 /* Extensions */,
B887517225E0102000DB86D6 /* Parsers */,
B887515C25E0102000DB86D6 /* PhotoCaptureDelegate.swift */,
B887516D25E0102000DB86D6 /* React Helpers */,
B887516D25E0102000DB86D6 /* React Utils */,
B887516025E0102000DB86D6 /* VideoCaptureDelegate.swift */,
134814211AA4EA7D00B7C361 /* Products */,
);
@@ -162,14 +162,14 @@
path = Extensions;
sourceTree = "<group>";
};
B887516D25E0102000DB86D6 /* React Helpers */ = {
B887516D25E0102000DB86D6 /* React Utils */ = {
isa = PBXGroup;
children = (
B887516E25E0102000DB86D6 /* MakeReactError.swift */,
B887516F25E0102000DB86D6 /* ReactLogger.swift */,
B887517025E0102000DB86D6 /* Promise.swift */,
);
path = "React Helpers";
path = "React Utils";
sourceTree = "<group>";
};
B887517225E0102000DB86D6 /* Parsers */ = {