1// Copyright 2016-present 650 Industries. All rights reserved.
2
3#import <EXCamera/EXCameraCameraPermissionRequester.h>
4#import <ExpoModulesCore/EXDefines.h>
5#import <ExpoModulesCore/EXPermissionsInterface.h>
6
7#import <AVFoundation/AVFoundation.h>
8
9
10@implementation EXCameraCameraPermissionRequester
11
12+ (NSString *)permissionType {
13  return @"camera";
14}
15
16- (NSDictionary *)getPermissions
17{
18  AVAuthorizationStatus systemStatus;
19  EXPermissionStatus status;
20  NSString *cameraUsageDescription = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSCameraUsageDescription"];
21
22  if (!cameraUsageDescription) {
23    EXFatal(EXErrorWithMessage(@"This app is missing NSCameraUsageDescription, so video services will fail. Add this entry to your bundle's Info.plist."));
24    systemStatus = AVAuthorizationStatusDenied;
25  } else {
26    systemStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
27  }
28  switch (systemStatus) {
29    case AVAuthorizationStatusAuthorized:
30      status = EXPermissionStatusGranted;
31      break;
32    case AVAuthorizationStatusDenied:
33    case AVAuthorizationStatusRestricted:
34      status = EXPermissionStatusDenied;
35      break;
36    case AVAuthorizationStatusNotDetermined:
37      status = EXPermissionStatusUndetermined;
38      break;
39  }
40  return @{
41    @"status": @(status)
42  };
43}
44
45- (void)requestPermissionsWithResolver:(EXPromiseResolveBlock)resolve rejecter:(EXPromiseRejectBlock)reject
46{
47  EX_WEAKIFY(self)
48  [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
49    EX_STRONGIFY(self)
50    resolve([self getPermissions]);
51  }];
52}
53
54@end
55