1*ce247f03SCharlie Cruzan// Copyright 2018-present 650 Industries. All rights reserved.
2*ce247f03SCharlie Cruzan
3*ce247f03SCharlie Cruzan#import <EXScreenCapture/EXScreenCaptureModule.h>
4*ce247f03SCharlie Cruzan
5*ce247f03SCharlie Cruzan@interface EXScreenCaptureModule ()
6*ce247f03SCharlie Cruzan
7*ce247f03SCharlie Cruzan@property (nonatomic, weak) UMModuleRegistry *moduleRegistry;
8*ce247f03SCharlie Cruzan
9*ce247f03SCharlie Cruzan@end
10*ce247f03SCharlie Cruzan
11*ce247f03SCharlie Cruzan@implementation EXScreenCaptureModule {
12*ce247f03SCharlie Cruzan  UIView *_blockView;
13*ce247f03SCharlie Cruzan}
14*ce247f03SCharlie Cruzan
15*ce247f03SCharlie Cruzan- (instancetype)init {
16*ce247f03SCharlie Cruzan  if (self = [super init]) {
17*ce247f03SCharlie Cruzan    CGFloat boundLength = MAX([[UIScreen mainScreen] bounds].size.width, [[UIScreen mainScreen] bounds].size.height);
18*ce247f03SCharlie Cruzan    _blockView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, boundLength, boundLength)];
19*ce247f03SCharlie Cruzan    _blockView.backgroundColor = UIColor.blackColor;
20*ce247f03SCharlie Cruzan  }
21*ce247f03SCharlie Cruzan  return self;
22*ce247f03SCharlie Cruzan}
23*ce247f03SCharlie Cruzan
24*ce247f03SCharlie CruzanUM_EXPORT_MODULE(ExpoScreenCapture);
25*ce247f03SCharlie Cruzan
26*ce247f03SCharlie Cruzan- (void)setModuleRegistry:(UMModuleRegistry *)moduleRegistry
27*ce247f03SCharlie Cruzan{
28*ce247f03SCharlie Cruzan  _moduleRegistry = moduleRegistry;
29*ce247f03SCharlie Cruzan}
30*ce247f03SCharlie Cruzan
31*ce247f03SCharlie CruzanUM_EXPORT_METHOD_AS(preventScreenCapture,
32*ce247f03SCharlie Cruzan                    preventScreenCaptureWithResolver:(UMPromiseResolveBlock)resolve
33*ce247f03SCharlie Cruzan                    reject:(UMPromiseRejectBlock)reject)
34*ce247f03SCharlie Cruzan{
35*ce247f03SCharlie Cruzan  if (@available(iOS 11.0, *) ) {
36*ce247f03SCharlie Cruzan    // If already recording, block it
37*ce247f03SCharlie Cruzan    dispatch_async(dispatch_get_main_queue(), ^{
38*ce247f03SCharlie Cruzan      [self preventScreenRecording];
39*ce247f03SCharlie Cruzan    });
40*ce247f03SCharlie Cruzan
41*ce247f03SCharlie Cruzan    // Avoid setting duplicate observers
42*ce247f03SCharlie Cruzan    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIScreenCapturedDidChangeNotification object:nil];
43*ce247f03SCharlie Cruzan
44*ce247f03SCharlie Cruzan    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(preventScreenRecording) name:UIScreenCapturedDidChangeNotification object:nil];
45*ce247f03SCharlie Cruzan  }
46*ce247f03SCharlie Cruzan
47*ce247f03SCharlie Cruzan  resolve([NSNull null]);
48*ce247f03SCharlie Cruzan}
49*ce247f03SCharlie Cruzan
50*ce247f03SCharlie CruzanUM_EXPORT_METHOD_AS(allowScreenCapture,
51*ce247f03SCharlie Cruzan                    allowScreenCaptureWithResolver:(UMPromiseResolveBlock)resolve
52*ce247f03SCharlie Cruzan                    rejecter:(UMPromiseRejectBlock)reject)
53*ce247f03SCharlie Cruzan{
54*ce247f03SCharlie Cruzan  if (@available(iOS 11.0, *)) {
55*ce247f03SCharlie Cruzan    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIScreenCapturedDidChangeNotification object:nil];
56*ce247f03SCharlie Cruzan  }
57*ce247f03SCharlie Cruzan
58*ce247f03SCharlie Cruzan  resolve([NSNull null]);
59*ce247f03SCharlie Cruzan}
60*ce247f03SCharlie Cruzan
61*ce247f03SCharlie Cruzan- (void)preventScreenRecording {
62*ce247f03SCharlie Cruzan  if (@available(iOS 11.0, *)) {
63*ce247f03SCharlie Cruzan    BOOL isCaptured = [[UIScreen mainScreen] isCaptured];
64*ce247f03SCharlie Cruzan
65*ce247f03SCharlie Cruzan    if (isCaptured) {
66*ce247f03SCharlie Cruzan      [UIApplication.sharedApplication.keyWindow.subviews.firstObject addSubview:_blockView];
67*ce247f03SCharlie Cruzan    } else {
68*ce247f03SCharlie Cruzan      [_blockView removeFromSuperview];
69*ce247f03SCharlie Cruzan    }
70*ce247f03SCharlie Cruzan  }
71*ce247f03SCharlie Cruzan}
72*ce247f03SCharlie Cruzan
73*ce247f03SCharlie Cruzan@end
74