diff --git a/index.js b/index.js index 17dbd4b..eb96614 100644 --- a/index.js +++ b/index.js @@ -45,6 +45,17 @@ class InCallManager { _InCallManager.turnScreenOn(); } + setFlashOn(enable, brightness) { + if (Platform.OS === 'ios') { + enable = (enable === true) ? true : false; + brightness = (typeof brightness === 'number') ? brightness : 0; + _InCallManager.setFlashOn(enable, brightness); + } else { + console.log("Android doesn't support setFlashOn(enable, brightness)"); + } + } + + setKeepScreenOn(enable) { enable = (enable === true) ? true : false; _InCallManager.setKeepScreenOn(enable); diff --git a/ios/RNInCallManager/RNInCallManager.swift b/ios/RNInCallManager/RNInCallManager.swift index 71b68be..1d78be7 100644 --- a/ios/RNInCallManager/RNInCallManager.swift +++ b/ios/RNInCallManager/RNInCallManager.swift @@ -56,6 +56,8 @@ class RNInCallManager: NSObject, AVAudioPlayerDelegate { var cameraPermission: String! var media: String = "audio" + private lazy var device: AVCaptureDevice? = { AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo) }() + // --- AVAudioSessionCategoryOptionAllowBluetooth: // --- Valid only if the audio session category is AVAudioSessionCategoryPlayAndRecord or AVAudioSessionCategoryRecord. // --- Using VoiceChat/VideoChat mode has the side effect of enabling the AVAudioSessionCategoryOptionAllowBluetooth category option. @@ -250,6 +252,24 @@ class RNInCallManager: NSObject, AVAudioPlayerDelegate { } } + @objc func setFlashOn(enable: Bool, brightness: NSNumber) -> Void { + guard let device = device else { return } + if device.hasTorch && device.position == AVCaptureDevicePosition.Back { + do { + try device.lockForConfiguration() + if enable { + try device.setTorchModeOnWithLevel(brightness.floatValue) + } else { + device.torchMode = .Off + } + NSLog("RNInCallManager.setForceSpeakerphoneOn(): enable: \(enable)") + device.unlockForConfiguration() + } catch let error { + NSLog("RNInCallManager.setFlashOn error != \(error)") + } + } + } + @objc func setKeepScreenOn(_ enable: Bool) -> Void { NSLog("RNInCallManager.setKeepScreenOn(): enable: \(enable)") UIApplication.shared.isIdleTimerDisabled = enable diff --git a/ios/RNInCallManager/RNInCallManagerBridge.m b/ios/RNInCallManager/RNInCallManagerBridge.m index f3aab4e..9ef2651 100644 --- a/ios/RNInCallManager/RNInCallManagerBridge.m +++ b/ios/RNInCallManager/RNInCallManagerBridge.m @@ -13,6 +13,7 @@ @interface RCT_EXTERN_REMAP_MODULE(InCallManager, RNInCallManager, NSObject) RCT_EXTERN_METHOD(stop:(NSString *)busytone) RCT_EXTERN_METHOD(turnScreenOn) RCT_EXTERN_METHOD(turnScreenOff) +RCT_EXTERN_METHOD(setFlashOn:(BOOL)enable brightness:(nonnull NSNumber *)brightness) RCT_EXTERN_METHOD(setKeepScreenOn:(BOOL)enable) RCT_EXTERN_METHOD(setSpeakerphoneOn:(BOOL)enable) RCT_EXTERN_METHOD(setForceSpeakerphoneOn:(int)flag)