1284d4840SŁukasz Kosmaty// Copyright 2016-present 650 Industries. All rights reserved.
2284d4840SŁukasz Kosmaty
3284d4840SŁukasz Kosmaty#import <EXBarCodeScanner/EXBarCodeCameraRequester.h>
4*314e850cSTomasz Sapeta#import <ExpoModulesCore/EXDefines.h>
5fb3d99c5STomasz Sapeta#import <ExpoModulesCore/EXPermissionsInterface.h>
6284d4840SŁukasz Kosmaty
7284d4840SŁukasz Kosmaty#import <AVFoundation/AVFoundation.h>
8284d4840SŁukasz Kosmaty
9284d4840SŁukasz Kosmaty
10284d4840SŁukasz Kosmaty@implementation EXBareCodeCameraRequester
11284d4840SŁukasz Kosmaty
12284d4840SŁukasz Kosmaty+ (NSString *)permissionType {
13284d4840SŁukasz Kosmaty  return @"camera";
14284d4840SŁukasz Kosmaty}
15284d4840SŁukasz Kosmaty
16284d4840SŁukasz Kosmaty- (NSDictionary *)getPermissions
17284d4840SŁukasz Kosmaty{
18284d4840SŁukasz Kosmaty  AVAuthorizationStatus systemStatus;
19fb3d99c5STomasz Sapeta  EXPermissionStatus status;
20284d4840SŁukasz Kosmaty  NSString *cameraUsageDescription = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSCameraUsageDescription"];
21ec877ef8Sandy  if (!cameraUsageDescription) {
22*314e850cSTomasz Sapeta    EXFatal(EXErrorWithMessage(@"This app is missing 'NSCameraUsageDescription', so video services will fail. Add this entry to your bundle's Info.plist."));
23284d4840SŁukasz Kosmaty    systemStatus = AVAuthorizationStatusDenied;
24284d4840SŁukasz Kosmaty  } else {
25284d4840SŁukasz Kosmaty    systemStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
26284d4840SŁukasz Kosmaty  }
27284d4840SŁukasz Kosmaty  switch (systemStatus) {
28284d4840SŁukasz Kosmaty    case AVAuthorizationStatusAuthorized:
29fb3d99c5STomasz Sapeta      status = EXPermissionStatusGranted;
30284d4840SŁukasz Kosmaty      break;
31284d4840SŁukasz Kosmaty    case AVAuthorizationStatusDenied:
32284d4840SŁukasz Kosmaty    case AVAuthorizationStatusRestricted:
33fb3d99c5STomasz Sapeta      status = EXPermissionStatusDenied;
34284d4840SŁukasz Kosmaty      break;
35284d4840SŁukasz Kosmaty    case AVAuthorizationStatusNotDetermined:
36fb3d99c5STomasz Sapeta      status = EXPermissionStatusUndetermined;
37284d4840SŁukasz Kosmaty      break;
38284d4840SŁukasz Kosmaty  }
39284d4840SŁukasz Kosmaty  return @{
40284d4840SŁukasz Kosmaty    @"status": @(status)
41284d4840SŁukasz Kosmaty  };
42284d4840SŁukasz Kosmaty}
43284d4840SŁukasz Kosmaty
44*314e850cSTomasz Sapeta- (void)requestPermissionsWithResolver:(EXPromiseResolveBlock)resolve rejecter:(EXPromiseRejectBlock)reject
45284d4840SŁukasz Kosmaty{
46*314e850cSTomasz Sapeta  EX_WEAKIFY(self)
47284d4840SŁukasz Kosmaty  [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
48*314e850cSTomasz Sapeta    EX_STRONGIFY(self)
49284d4840SŁukasz Kosmaty    resolve([self getPermissions]);
50284d4840SŁukasz Kosmaty  }];
51284d4840SŁukasz Kosmaty}
52284d4840SŁukasz Kosmaty
53284d4840SŁukasz Kosmaty@end
54