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