Skip to content

Commit 96b5104

Browse files
authored
Merge pull request #747 from teslamotors/torch-startup-ios
Fixed torch not being enabled on startup #593
2 parents e0a4c5f + e3c93b9 commit 96b5104

2 files changed

Lines changed: 30 additions & 31 deletions

File tree

example/ios/Podfile.lock

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2223,7 +2223,7 @@ PODS:
22232223
- React-perflogger (= 0.81.0)
22242224
- React-utils (= 0.81.0)
22252225
- SocketRocket
2226-
- ReactNativeCameraKit (16.0.1):
2226+
- ReactNativeCameraKit (16.1.1):
22272227
- boost
22282228
- DoubleConversion
22292229
- fast_float
@@ -2528,14 +2528,14 @@ SPEC CHECKSUMS:
25282528
React-performancetimeline: 1f86dc9782e3fe78727c5fbb3e2178b9fd1aa6fd
25292529
React-RCTActionSheet: 550c9c6c2e7dcd85a51954dc08e2f3837a148e7c
25302530
React-RCTAnimation: 19d4bb6d2190983d1354b096b7b65dbd591924da
2531-
React-RCTAppDelegate: 4512132c26eb717a81d4a0b6516f178639e9abf0
2531+
React-RCTAppDelegate: 6c71d16eef920831a312ff363355fc3b99c02a98
25322532
React-RCTBlob: b81a0cffe1a083bcf9d8aa9f27f4d37864579e90
2533-
React-RCTFabric: e256e79bdab3d2c4bb6e5975224484d0f42131f3
2534-
React-RCTFBReactNativeSpec: 8442e61116ea32de3fc3664651f7a78da11c6ba0
2533+
React-RCTFabric: 01005d2fa799bba6e21aae18820498f56fe0be5f
2534+
React-RCTFBReactNativeSpec: 5adb84a81c4ed7a1f2661835d166e4b2c4320cd4
25352535
React-RCTImage: 607e5e373fb56d72417464bd82e8046af81ab502
25362536
React-RCTLinking: 301434c7bf1100458be5a3866326ba33491e3687
25372537
React-RCTNetwork: a118a47bd123ac96c9877e04f5731a1d6545aba5
2538-
React-RCTRuntime: b1e67bc601a330d1f72c71246557541efbc121a4
2538+
React-RCTRuntime: 85fdbf469fe8a12c4db6c836731b190efc33d11d
25392539
React-RCTSettings: 5a5aa2cf9ac40f7a8897cc0f9d945ac803886604
25402540
React-RCTText: e6e00bee9847a8af1218079b73c8bfed16c75b8d
25412541
React-RCTVibration: 5a05fa0ef05ee73d074a3314e57586afc969f1ba
@@ -2552,10 +2552,10 @@ SPEC CHECKSUMS:
25522552
ReactAppDependencyProvider: c91900fa724baee992f01c05eeb4c9e01a807f78
25532553
ReactCodegen: a55799cae416c387aeaae3aabc1bc0289ac19cee
25542554
ReactCommon: 116d6ee71679243698620d8cd9a9042541e44aa6
2555-
ReactNativeCameraKit: 29206675814ffb96b09a200b999ad5fa9b858a08
2555+
ReactNativeCameraKit: b01e637c97fb6eefe43eff31917d1410fc77e1f8
25562556
SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748
25572557
Yoga: 00013dd9cde63a2d98e8002fcc4f5ddb66c10782
25582558

2559-
PODFILE CHECKSUM: 2a7cb4991754518b63a1c5b884f5861886abdce4
2559+
PODFILE CHECKSUM: 831b9773c4c6aed2643524d13cb247994d19e1e9
25602560

25612561
COCOAPODS: 1.15.2

ios/ReactNativeCameraKit/RealCamera.swift

Lines changed: 23 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,6 @@ class RealCamera: NSObject, CameraProtocol, AVCaptureMetadataOutputObjectsDelega
128128

129129
if self.setupResult == .success {
130130
self.session.startRunning()
131-
132-
// We need to reapply the configuration after starting the camera
133-
self.update(torchMode: self.torchMode)
134131
}
135132

136133
DispatchQueue.main.async {
@@ -227,6 +224,7 @@ class RealCamera: NSObject, CameraProtocol, AVCaptureMetadataOutputObjectsDelega
227224

228225
do {
229226
try videoDevice.lockForConfiguration()
227+
self.reconfigureLockedVideoDevice(videoDevice)
230228

231229
if videoDevice.isFocusPointOfInterestSupported && videoDevice.isFocusModeSupported(focusBehavior.avFocusMode) {
232230
videoDevice.focusPointOfInterest = devicePoint
@@ -257,14 +255,12 @@ class RealCamera: NSObject, CameraProtocol, AVCaptureMetadataOutputObjectsDelega
257255
self.torchMode = torchMode
258256
guard let videoDevice = self.videoDeviceInput?.device, videoDevice.torchMode != torchMode.avTorchMode else { return }
259257

260-
if videoDevice.isTorchModeSupported(torchMode.avTorchMode) && videoDevice.hasTorch {
261-
do {
262-
try videoDevice.lockForConfiguration()
263-
videoDevice.torchMode = torchMode.avTorchMode
264-
videoDevice.unlockForConfiguration()
265-
} catch {
266-
print("Error setting torch mode: \(error)")
267-
}
258+
do {
259+
try videoDevice.lockForConfiguration()
260+
defer { videoDevice.unlockForConfiguration() }
261+
self.reconfigureLockedVideoDevice(videoDevice)
262+
} catch {
263+
print("Error setting torch mode: \(error)")
268264
}
269265
}
270266
}
@@ -300,24 +296,23 @@ class RealCamera: NSObject, CameraProtocol, AVCaptureMetadataOutputObjectsDelega
300296

301297
self.removeObservers()
302298
self.session.beginConfiguration()
303-
defer { self.session.commitConfiguration() }
299+
defer {
300+
self.session.commitConfiguration()
301+
self.resetZoom(forDevice: videoDevice)
302+
}
304303

305304
// Remove the existing device input first, since using the front and back camera simultaneously is not supported.
306305
self.session.removeInput(currentViewDeviceInput)
307306

308307
if self.session.canAddInput(videoDeviceInput) {
309308
self.session.addInput(videoDeviceInput)
310-
self.resetZoom(forDevice: videoDevice)
311309
self.videoDeviceInput = videoDeviceInput
312310
} else {
313311
// If it fails, put back current camera
314312
self.session.addInput(currentViewDeviceInput)
315313
}
316314

317315
self.addObservers()
318-
319-
// We need to reapply the configuration after reloading the camera
320-
self.update(torchMode: self.torchMode)
321316
}
322317
}
323318

@@ -394,9 +389,6 @@ class RealCamera: NSObject, CameraProtocol, AVCaptureMetadataOutputObjectsDelega
394389

395390
if self.metadataOutput.metadataObjectTypes != newTypes {
396391
self.metadataOutput.metadataObjectTypes = newTypes
397-
398-
// Setting metadataObjectTypes reloads the camera, we need to reapply the configuration
399-
self.update(torchMode: self.torchMode)
400392
}
401393
}
402394
}
@@ -425,8 +417,6 @@ class RealCamera: NSObject, CameraProtocol, AVCaptureMetadataOutputObjectsDelega
425417
}
426418

427419
self.metadataOutput.rectOfInterest = visibleRect ?? CGRect(x: 0, y: 0, width: 1, height: 1)
428-
// We need to reapply the configuration after touching the metadataOutput
429-
self.update(torchMode: self.torchMode)
430420
}
431421
}
432422
}
@@ -506,7 +496,10 @@ class RealCamera: NSObject, CameraProtocol, AVCaptureMetadataOutputObjectsDelega
506496
}
507497

508498
session.beginConfiguration()
509-
defer { session.commitConfiguration() }
499+
defer {
500+
session.commitConfiguration()
501+
self.resetZoom(forDevice: videoDevice)
502+
}
510503

511504
session.sessionPreset = .photo
512505

@@ -518,9 +511,7 @@ class RealCamera: NSObject, CameraProtocol, AVCaptureMetadataOutputObjectsDelega
518511

519512
if session.canAddInput(videoDeviceInput) {
520513
session.addInput(videoDeviceInput)
521-
522514
self.videoDeviceInput = videoDeviceInput
523-
self.resetZoom(forDevice: videoDevice)
524515
} else {
525516
return .sessionConfigurationFailed
526517
}
@@ -573,12 +564,20 @@ class RealCamera: NSObject, CameraProtocol, AVCaptureMetadataOutputObjectsDelega
573564
do {
574565
try videoDevice.lockForConfiguration()
575566
defer { videoDevice.unlockForConfiguration() }
567+
reconfigureLockedVideoDevice(videoDevice)
576568
let defaultZoom = defaultZoomFactor(for: videoDevice)
577569
videoDevice.videoZoomFactor = zoom * defaultZoom
578570
} catch {
579571
print("CKCameraKit: setZoomFor error: \(error))")
580572
}
581573
}
574+
575+
// Torch mode will turn off unless set again when the videoDevice is locked and unlocked
576+
private func reconfigureLockedVideoDevice(_ videoDevice: AVCaptureDevice) {
577+
if videoDevice.isTorchModeSupported(torchMode.avTorchMode) && videoDevice.hasTorch {
578+
videoDevice.torchMode = torchMode.avTorchMode
579+
}
580+
}
582581

583582
private func normalizedZoom(for videoDevice: AVCaptureDevice) -> Double {
584583
let defaultZoom = defaultZoomFactor(for: videoDevice)

0 commit comments

Comments
 (0)