1// Copyright 2016-present 650 Industries. All rights reserved.
2
3#import <EXBarCodeScanner/EXBarCodeCameraRequester.h>
4#import <UMCore/UMDefines.h>
5#import <UMPermissionsInterface/UMPermissionsInterface.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  UMPermissionStatus status;
20  NSString *cameraUsageDescription = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSCameraUsageDescription"];
21  NSString *microphoneUsageDescription = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSMicrophoneUsageDescription"];
22  if (!(cameraUsageDescription && microphoneUsageDescription)) {
23    UMFatal(UMErrorWithMessage(@"This app is missing either 'NSCameraUsageDescription' or 'NSMicrophoneUsageDescription', so audio/video services will fail. Add both of these entries 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 = UMPermissionStatusGranted;
31      break;
32    case AVAuthorizationStatusDenied:
33    case AVAuthorizationStatusRestricted:
34      status = UMPermissionStatusDenied;
35      break;
36    case AVAuthorizationStatusNotDetermined:
37      status = UMPermissionStatusUndetermined;
38      break;
39  }
40  return @{
41    @"status": @(status)
42  };
43}
44
45- (void)requestPermissionsWithResolver:(UMPromiseResolveBlock)resolve rejecter:(UMPromiseRejectBlock)reject
46{
47  UM_WEAKIFY(self)
48  [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
49    UM_STRONGIFY(self)
50    resolve([self getPermissions]);
51  }];
52}
53
54@end
55