Swiftgram/submodules/LegacyComponents/Sources/TGPassportScanController.m
2020-02-22 15:38:54 +04:00

207 lines
7.1 KiB
Objective-C

#import "TGPassportScanController.h"
#import "TGPassportScanView.h"
#import "LegacyComponentsInternal.h"
@interface TGPassportScanController ()
{
TGPassportScanControllerTheme *_theme;
UILabel *_titleLabel;
UILabel *_descriptionLabel;
UIView *_topFadeView;
UIView *_bottomFadeView;
UIView *_centerFadeView;
TGPassportScanView *_scanView;
}
@end
@implementation TGPassportScanController
- (instancetype)initWithContext:(id<LegacyComponentsContext>)context theme:(TGPassportScanControllerTheme *)theme
{
self = [super initWithContext:context];
if (self != nil)
{
_theme = theme;
[self setLeftBarButtonItem:[[UIBarButtonItem alloc] initWithTitle:TGLocalized(@"Common.Cancel") style:UIBarButtonItemStylePlain target:self action:@selector(cancelButtonPressed)]];
}
return self;
}
- (void)cancelButtonPressed
{
[self.presentingViewController dismissViewControllerAnimated:true completion:nil];
}
- (void)loadView
{
[super loadView];
self.view.backgroundColor = _theme.backgroundColor;
_titleLabel = [[UILabel alloc] init];
_titleLabel.backgroundColor = [UIColor clearColor];
_titleLabel.font = TGBoldSystemFontOfSize(23.0f);
_titleLabel.numberOfLines = 0;
_titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
_titleLabel.textColor = _theme.textColor;
_titleLabel.text = TGLocalized(@"Passport.ScanPassport");
_titleLabel.textAlignment = NSTextAlignmentCenter;
[self.view addSubview:_titleLabel];
_descriptionLabel = [[UILabel alloc] init];
_descriptionLabel.backgroundColor = [UIColor clearColor];
_descriptionLabel.font = TGSystemFontOfSize(17.0f);
_descriptionLabel.numberOfLines = 0;
_descriptionLabel.lineBreakMode = NSLineBreakByWordWrapping;
_descriptionLabel.textColor = _theme.textColor;
_descriptionLabel.textAlignment = NSTextAlignmentCenter;
_descriptionLabel.text = TGLocalized(@"Passport.ScanPassportHelp");
[self.view addSubview:_descriptionLabel];
__weak TGPassportScanController *weakSelf = self;
_scanView = [[TGPassportScanView alloc] init];
_scanView.finishedWithMRZ = ^(TGPassportMRZ *mrz)
{
__strong TGPassportScanController *strongSelf = weakSelf;
if (strongSelf != nil)
[strongSelf finishWithMRZ:mrz];
};
[self.view addSubview:_scanView];
_topFadeView = [[UIView alloc] init];
_topFadeView.backgroundColor = UIColorRGBA(0x000000, 0.4f);
[self.view addSubview:_topFadeView];
_bottomFadeView = [[UIView alloc] init];
_bottomFadeView.backgroundColor = UIColorRGBA(0x000000, 0.4f);
[self.view addSubview:_bottomFadeView];
_centerFadeView = [[UIView alloc] init];
_centerFadeView.alpha = 0.0f;
_centerFadeView.backgroundColor = UIColorRGBA(0x000000, 0.4f);
[self.view addSubview:_centerFadeView];
}
- (void)finishWithMRZ:(TGPassportMRZ *)mrz
{
UILabel *label = [[UILabel alloc] init];
label.font = TGFixedSystemFontOfSize(17.0f);
label.textColor = [UIColor whiteColor];
label.numberOfLines = 3;
label.text = mrz.mrz;
[label sizeToFit];
if (label.frame.size.width > self.view.frame.size.width - 20.0f)
{
label.font = TGFixedSystemFontOfSize(16.0f);
[label sizeToFit];
}
label.center = CGPointMake(self.view.frame.size.width / 2.0f, CGRectGetMaxY(_centerFadeView.frame) - label.frame.size.height / 2.0f - 50.0f);
[self.view addSubview:label];
label.alpha = 0.0f;
[UIView animateWithDuration:0.2 animations:^
{
label.alpha = 1.0f;
_centerFadeView.alpha = 1.0f;
}];
TGDispatchAfter(1.0, dispatch_get_main_queue(), ^
{
if (self.finishedWithMRZ != nil)
self.finishedWithMRZ(mrz);
[self cancelButtonPressed];
});
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[_scanView start];
[[[LegacyComponentsGlobals provider] applicationInstance] setIdleTimerDisabled:true];
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
[_scanView stop];
[[[LegacyComponentsGlobals provider] applicationInstance] setIdleTimerDisabled:false];
}
- (void)manualButtonPressed
{
if (self.finishedWithMRZ != nil)
self.finishedWithMRZ(nil);
}
- (void)viewWillLayoutSubviews
{
[super viewWillLayoutSubviews];
CGFloat inset = 30.0f;
CGSize textSize = [_titleLabel.attributedText boundingRectWithSize:CGSizeMake(self.view.frame.size.width - inset, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin context:NULL].size;
textSize.width = CGCeil(textSize.width);
textSize.height = CGCeil(textSize.height);
CGFloat scanHeight = MIN(475.0f, self.view.frame.size.height - textSize.height - 64.0f - 160.0f);
_scanView.frame = CGRectMake(0.0f, 64.0f, self.view.frame.size.width, scanHeight);
CGFloat documentFrameHeight = self.view.frame.size.width * 0.704f;
CGFloat documentTopEdge = CGRectGetMidY(_scanView.frame) - documentFrameHeight / 2.0f;
CGFloat documentBottomEdge = CGRectGetMidY(_scanView.frame) + documentFrameHeight / 2.0f;
_topFadeView.frame = CGRectMake(0.0f, CGRectGetMinY(_scanView.frame), self.view.frame.size.width, documentTopEdge - CGRectGetMinY(_scanView.frame));
_bottomFadeView.frame = CGRectMake(0.0f, documentBottomEdge, self.view.frame.size.width, CGRectGetMaxY(_scanView.frame) - documentBottomEdge);
_centerFadeView.frame = CGRectMake(0.0f, CGRectGetMaxY(_topFadeView.frame), self.view.frame.size.width, CGRectGetMinY(_bottomFadeView.frame) - CGRectGetMaxY(_topFadeView.frame));
UIEdgeInsets safeAreaInset = self.calculatedSafeAreaInset;
CGFloat textPanelHeight = self.view.frame.size.height - 64.0f - scanHeight - safeAreaInset.bottom;
CGSize descriptionSize = [_descriptionLabel.attributedText boundingRectWithSize:CGSizeMake(self.view.frame.size.width - inset, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin context:NULL].size;
descriptionSize.width = CGCeil(descriptionSize.width);
descriptionSize.height = CGCeil(descriptionSize.height);
_titleLabel.frame = CGRectMake(TGScreenPixelFloor((self.view.frame.size.width - textSize.width) / 2.0f), TGScreenPixelFloor(CGRectGetMaxY(_scanView.frame) + (textPanelHeight - textSize.height - 12.0f - descriptionSize.height) / 2.0f), textSize.width, textSize.height);
_descriptionLabel.frame = CGRectMake(round((self.view.frame.size.width - descriptionSize.width) / 2.0f), CGRectGetMaxY(_titleLabel.frame) + 12.0f, descriptionSize.width, descriptionSize.height);
}
- (BOOL)shouldAutorotate
{
return false;
}
- (UIInterfaceOrientationMask)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskPortrait;
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return UIInterfaceOrientationPortrait;
}
@end
@implementation TGPassportScanControllerTheme
- (instancetype)initWithBackgroundColor:(UIColor *)backgroundColor textColor:(UIColor *)textColor
{
self = [super init];
if (self != nil)
{
_backgroundColor = backgroundColor;
_textColor = textColor;
}
return self;
}
@end