1// Copyright 2016-present 650 Industries. All rights reserved.
2
3#import <EXAV/EXAudioRecordingPermissionRequester.h>
4#import <ExpoModulesCore/EXDefines.h>
5
6#import <AVFoundation/AVFoundation.h>
7
8@implementation EXAudioRecordingPermissionRequester
9
10+ (NSString *)permissionType
11{
12  return @"audioRecording";
13}
14
15- (NSDictionary *)getPermissions
16{
17  AVAudioSessionRecordPermission systemStatus;
18  EXPermissionStatus status;
19
20  NSString *microphoneUsageDescription = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSMicrophoneUsageDescription"];
21  if (!microphoneUsageDescription) {
22    EXFatal(EXErrorWithMessage(@"This app is missing NSMicrophoneUsageDescription, so audio services will fail. Add one of these keys to your bundle's Info.plist."));
23    systemStatus = AVAudioSessionRecordPermissionDenied;
24  } else {
25    systemStatus = [[AVAudioSession sharedInstance] recordPermission];
26  }
27  switch (systemStatus) {
28    case AVAudioSessionRecordPermissionGranted:
29      status = EXPermissionStatusGranted;
30      break;
31    case AVAudioSessionRecordPermissionDenied:
32      status = EXPermissionStatusDenied;
33      break;
34    case AVAudioSessionRecordPermissionUndetermined:
35      status = EXPermissionStatusUndetermined;
36      break;
37  }
38
39  return @{
40    @"status": @(status)
41  };
42}
43
44- (void)requestPermissionsWithResolver:(EXPromiseResolveBlock)resolve rejecter:(EXPromiseRejectBlock)reject
45{
46  EX_WEAKIFY(self)
47  [[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL granted) {
48    EX_STRONGIFY(self)
49    resolve([self getPermissions]);
50  }];
51}
52
53@end
54