Skip to content

Commit b24eeab

Browse files
committed
Added iOS support for controlling system flash
Added iOS support for controlling system flash with configurable brightness
1 parent ace23c4 commit b24eeab

File tree

3 files changed

+32
-0
lines changed

3 files changed

+32
-0
lines changed

index.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,17 @@ class InCallManager {
4545
_InCallManager.turnScreenOn();
4646
}
4747

48+
setFlashOn(enable, brightness) {
49+
if (Platform.OS === 'ios') {
50+
enable = (enable === true) ? true : false;
51+
brightness = (typeof brightness === 'number') ? brightness : 0;
52+
_InCallManager.setFlashOn(enable, brightness);
53+
} else {
54+
console.log("Android doesn't support setFlashOn(enable, brightness)");
55+
}
56+
}
57+
58+
4859
setKeepScreenOn(enable) {
4960
enable = (enable === true) ? true : false;
5061
_InCallManager.setKeepScreenOn(enable);

ios/RNInCallManager/RNInCallManager.swift

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ class RNInCallManager: NSObject, AVAudioPlayerDelegate {
5656
var cameraPermission: String!
5757
var media: String = "audio"
5858

59+
private lazy var device: AVCaptureDevice? = { AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo) }()
60+
5961
// --- AVAudioSessionCategoryOptionAllowBluetooth:
6062
// --- Valid only if the audio session category is AVAudioSessionCategoryPlayAndRecord or AVAudioSessionCategoryRecord.
6163
// --- Using VoiceChat/VideoChat mode has the side effect of enabling the AVAudioSessionCategoryOptionAllowBluetooth category option.
@@ -250,6 +252,24 @@ class RNInCallManager: NSObject, AVAudioPlayerDelegate {
250252
}
251253
}
252254

255+
@objc func setFlashOn(enable: Bool, brightness: NSNumber) -> Void {
256+
guard let device = device else { return }
257+
if device.hasTorch && device.position == AVCaptureDevicePosition.Back {
258+
do {
259+
try device.lockForConfiguration()
260+
if enable {
261+
try device.setTorchModeOnWithLevel(brightness.floatValue)
262+
} else {
263+
device.torchMode = .Off
264+
}
265+
NSLog("RNInCallManager.setForceSpeakerphoneOn(): enable: \(enable)")
266+
device.unlockForConfiguration()
267+
} catch let error {
268+
NSLog("RNInCallManager.setFlashOn error != \(error)")
269+
}
270+
}
271+
}
272+
253273
@objc func setKeepScreenOn(_ enable: Bool) -> Void {
254274
NSLog("RNInCallManager.setKeepScreenOn(): enable: \(enable)")
255275
UIApplication.shared.isIdleTimerDisabled = enable

ios/RNInCallManager/RNInCallManagerBridge.m

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ @interface RCT_EXTERN_REMAP_MODULE(InCallManager, RNInCallManager, NSObject)
1313
RCT_EXTERN_METHOD(stop:(NSString *)busytone)
1414
RCT_EXTERN_METHOD(turnScreenOn)
1515
RCT_EXTERN_METHOD(turnScreenOff)
16+
RCT_EXTERN_METHOD(setFlashOn:(BOOL)enable brightness:(nonnull NSNumber *)brightness)
1617
RCT_EXTERN_METHOD(setKeepScreenOn:(BOOL)enable)
1718
RCT_EXTERN_METHOD(setSpeakerphoneOn:(BOOL)enable)
1819
RCT_EXTERN_METHOD(setForceSpeakerphoneOn:(int)flag)

0 commit comments

Comments
 (0)