mirror of https://github.com/oxen-io/session-ios
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			163 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Matlab
		
	
		
		
			
		
	
	
			163 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Matlab
		
	
| 
											9 years ago
										 | // | ||
| 
											7 years ago
										 | //  Copyright (c) 2019 Open Whisper Systems. All rights reserved. | ||
| 
											9 years ago
										 | // | ||
| 
											9 years ago
										 | 
 | ||
|  | #import "OWSQRCodeScanningViewController.h" | ||
| 
											9 years ago
										 | #import "OWSBezierPathView.h" | ||
| 
											9 years ago
										 | #import "UIColor+OWS.h" | ||
| 
											9 years ago
										 | #import "UIView+OWS.h" | ||
| 
											9 years ago
										 | 
 | ||
| 
											8 years ago
										 | NS_ASSUME_NONNULL_BEGIN | ||
|  | 
 | ||
| 
											9 years ago
										 | @interface OWSQRCodeScanningViewController () | ||
|  | 
 | ||
| 
											9 years ago
										 | @property (atomic) ZXCapture *capture; | ||
| 
											9 years ago
										 | @property (nonatomic) BOOL captureEnabled; | ||
| 
											9 years ago
										 | @property (nonatomic) UIView *maskingView; | ||
| 
											6 years ago
										 | @property (nonatomic) dispatch_queue_t captureQueue; | ||
| 
											9 years ago
										 | 
 | ||
|  | @end | ||
| 
											9 years ago
										 | 
 | ||
| 
											9 years ago
										 | #pragma mark - | ||
|  | 
 | ||
| 
											9 years ago
										 | @implementation OWSQRCodeScanningViewController | ||
|  | 
 | ||
| 
											9 years ago
										 | - (void)dealloc | ||
| 
											9 years ago
										 | { | ||
| 
											9 years ago
										 |     [self.capture.layer removeFromSuperlayer]; | ||
|  | } | ||
| 
											9 years ago
										 | 
 | ||
| 
											9 years ago
										 | - (instancetype)init | ||
|  | { | ||
|  |     self = [super init]; | ||
|  |     if (!self) { | ||
|  |         return self; | ||
| 
											9 years ago
										 |     } | ||
|  | 
 | ||
| 
											9 years ago
										 |     _captureEnabled = NO; | ||
| 
											6 years ago
										 |     _captureQueue = dispatch_get_main_queue(); | ||
| 
											9 years ago
										 | 
 | ||
|  |     return self; | ||
|  | } | ||
| 
											9 years ago
										 | 
 | ||
| 
											8 years ago
										 | - (nullable instancetype)initWithCoder:(NSCoder *)aDecoder | ||
| 
											9 years ago
										 | { | ||
|  |     self = [super initWithCoder:aDecoder]; | ||
|  |     if (!self) { | ||
|  |         return self; | ||
|  |     } | ||
| 
											9 years ago
										 | 
 | ||
| 
											9 years ago
										 |     _captureEnabled = NO; | ||
| 
											6 years ago
										 |     _captureQueue = dispatch_get_main_queue(); | ||
| 
											9 years ago
										 | 
 | ||
| 
											9 years ago
										 |     return self; | ||
|  | } | ||
| 
											9 years ago
										 | 
 | ||
| 
											9 years ago
										 | - (void)loadView | ||
| 
											9 years ago
										 | { | ||
| 
											9 years ago
										 |     [super loadView]; | ||
|  | 
 | ||
|  |     OWSBezierPathView *maskingView = [OWSBezierPathView new]; | ||
|  |     self.maskingView = maskingView; | ||
|  |     [maskingView setConfigureShapeLayerBlock:^(CAShapeLayer *layer, CGRect bounds) { | ||
|  |         // Add a circular mask | ||
|  |         UIBezierPath *path = [UIBezierPath bezierPathWithRect:bounds]; | ||
| 
											6 years ago
										 |         CGFloat margin = ScaleFromIPhone5To7Plus(24.f, 48.f); | ||
| 
											9 years ago
										 |         CGFloat radius = MIN(bounds.size.width, bounds.size.height) * 0.5f - margin; | ||
| 
											9 years ago
										 | 
 | ||
|  |         // Center the circle's bounding rectangle | ||
|  |         CGRect circleRect = CGRectMake( | ||
|  |             bounds.size.width * 0.5f - radius, bounds.size.height * 0.5f - radius, radius * 2.f, radius * 2.f); | ||
| 
											6 years ago
										 |         UIBezierPath *circlePath = [UIBezierPath bezierPathWithRoundedRect:circleRect cornerRadius:16.f]; | ||
| 
											9 years ago
										 |         [path appendPath:circlePath]; | ||
|  |         [path setUsesEvenOddFillRule:YES]; | ||
|  | 
 | ||
|  |         layer.path = path.CGPath; | ||
|  |         layer.fillRule = kCAFillRuleEvenOdd; | ||
| 
											6 years ago
										 |         layer.fillColor = UIColor.lokiDarkestGray.CGColor; | ||
|  |         layer.opacity = 0.32f; | ||
| 
											9 years ago
										 |     }]; | ||
|  |     [self.view addSubview:maskingView]; | ||
| 
											7 years ago
										 |     [maskingView ows_autoPinToSuperviewEdges]; | ||
| 
											9 years ago
										 | } | ||
|  | 
 | ||
| 
											9 years ago
										 | - (void)viewWillAppear:(BOOL)animated | ||
|  | { | ||
|  |     [super viewWillAppear:animated]; | ||
| 
											9 years ago
										 | 
 | ||
|  |     if (self.captureEnabled) { | ||
|  |         [self startCapture]; | ||
|  |     } | ||
| 
											9 years ago
										 | } | ||
|  | 
 | ||
| 
											9 years ago
										 | - (void)viewWillDisappear:(BOOL)animated | ||
| 
											9 years ago
										 | { | ||
| 
											9 years ago
										 |     [super viewWillDisappear:animated]; | ||
|  |     [self stopCapture]; | ||
| 
											9 years ago
										 | } | ||
| 
											9 years ago
										 | 
 | ||
| 
											7 years ago
										 | - (void)viewWillLayoutSubviews | ||
|  | { | ||
|  |     self.capture.layer.frame = self.view.bounds; | ||
|  | } | ||
|  | 
 | ||
| 
											9 years ago
										 | - (void)startCapture | ||
|  | { | ||
|  |     self.captureEnabled = YES; | ||
|  |     if (!self.capture) { | ||
| 
											6 years ago
										 |         dispatch_async(self.captureQueue, ^{ | ||
| 
											9 years ago
										 |             self.capture = [[ZXCapture alloc] init]; | ||
|  |             self.capture.camera = self.capture.back; | ||
|  |             self.capture.focusMode = AVCaptureFocusModeContinuousAutoFocus; | ||
|  |             self.capture.delegate = self; | ||
| 
											9 years ago
										 | 
 | ||
| 
											9 years ago
										 |             dispatch_async(dispatch_get_main_queue(), ^{ | ||
| 
											7 years ago
										 |                 self.capture.layer.frame = self.view.bounds; | ||
| 
											9 years ago
										 |                 [self.view.layer addSublayer:self.capture.layer]; | ||
|  |                 [self.view bringSubviewToFront:self.maskingView]; | ||
| 
											9 years ago
										 |                 [self.capture start]; | ||
| 
											9 years ago
										 |             }); | ||
|  |         }); | ||
| 
											9 years ago
										 |     } else { | ||
|  |         [self.capture start]; | ||
| 
											9 years ago
										 |     } | ||
|  | } | ||
| 
											9 years ago
										 | 
 | ||
| 
											9 years ago
										 | - (void)stopCapture | ||
|  | { | ||
| 
											9 years ago
										 |     self.captureEnabled = NO; | ||
| 
											6 years ago
										 |     dispatch_async(self.captureQueue, ^{ | ||
| 
											9 years ago
										 |         [self.capture stop]; | ||
|  |     }); | ||
| 
											9 years ago
										 | } | ||
|  | 
 | ||
| 
											9 years ago
										 | - (void)captureResult:(ZXCapture *)capture result:(ZXResult *)result | ||
|  | { | ||
| 
											9 years ago
										 |     if (!self.captureEnabled) { | ||
| 
											9 years ago
										 |         return; | ||
| 
											9 years ago
										 |     } | ||
| 
											9 years ago
										 |     [self stopCapture]; | ||
|  | 
 | ||
|  |     // Vibrate | ||
|  |     AudioServicesPlaySystemSound(kSystemSoundID_Vibrate); | ||
|  | 
 | ||
| 
											9 years ago
										 |     if (self.scanDelegate) { | ||
| 
											9 years ago
										 |         if ([self.scanDelegate respondsToSelector:@selector(controller:didDetectQRCodeWithData:)]) { | ||
| 
											7 years ago
										 |             OWSLogInfo(@"Scanned Data Code."); | ||
| 
											9 years ago
										 |             ZXByteArray *byteArray = result.resultMetadata[@(kResultMetadataTypeByteSegments)][0]; | ||
|  |             NSData *decodedData = [NSData dataWithBytes:byteArray.array length:byteArray.length]; | ||
|  | 
 | ||
|  |             [self.scanDelegate controller:self didDetectQRCodeWithData:decodedData]; | ||
|  |         } | ||
|  | 
 | ||
|  |         if ([self.scanDelegate respondsToSelector:@selector(controller:didDetectQRCodeWithString:)]) { | ||
| 
											7 years ago
										 |             OWSLogInfo(@"Scanned String Code."); | ||
| 
											9 years ago
										 |             [self.scanDelegate controller:self didDetectQRCodeWithString:result.text]; | ||
|  |         } | ||
| 
											9 years ago
										 |     } | ||
| 
											9 years ago
										 | } | ||
|  | 
 | ||
|  | @end | ||
| 
											8 years ago
										 | 
 | ||
|  | NS_ASSUME_NONNULL_END |