#import "TGItemPreviewController.h" #import "LegacyComponentsInternal.h" #import "TGViewController.h" #import "TGItemPreviewView.h" #import "TGOverlayControllerWindow.h" @interface TGItemPreviewController () { bool _autorotationWasEnabled; id _context; } @end @implementation TGItemPreviewController - (instancetype)initWithContext:(id)context parentController:(TGViewController *)parentController previewView:(TGItemPreviewView *)previewView { self = [self initWithContext:context]; if (self != nil) { _context = context; _previewView = previewView; _previewView.safeAreaInset = [TGViewController safeAreaInsetForOrientation:[LegacyComponentsGlobals provider].applicationStatusBarOrientation hasOnScreenNavigation:false]; TGOverlayControllerWindow *window = [[TGOverlayControllerWindow alloc] initWithManager:[context makeOverlayWindowManager] parentController:parentController contentController:self keepKeyboard:true]; window.windowLevel = UIWindowLevelStatusBar; window.tag = 0xbeef; window.userInteractionEnabled = previewView.userInteractionEnabled; window.hidden = false; __weak TGItemPreviewController *weakSelf = self; _previewView.onDismiss = ^ { __strong TGItemPreviewController *strongSelf = weakSelf; if (strongSelf != nil) [strongSelf dismissImmediately]; }; _previewView.willDismiss = ^{ __strong TGItemPreviewController *strongSelf = weakSelf; if (strongSelf != nil && strongSelf.onDismiss != nil) { void (^onDismiss)(void) = [strongSelf.onDismiss copy]; strongSelf.onDismiss = nil; onDismiss(); } }; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActive:) name:UIApplicationDidBecomeActiveNotification object:nil]; } return self; } - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; } - (void)viewDidLayoutSubviews { self.view.frame = [_context fullscreenBounds]; } - (void)applicationDidBecomeActive:(NSNotification *)__unused notification { [self.view.window makeKeyAndVisible]; } - (CGPoint (^)(id))sourcePointForItem { return _previewView.sourcePointForItem; } - (void)setSourcePointForItem:(CGPoint (^)(id))sourcePointForItem { _previewView.sourcePointForItem = [sourcePointForItem copy]; } - (void)loadView { [super loadView]; _previewView.frame = self.view.bounds; _previewView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; [self.view addSubview:_previewView]; } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; _autorotationWasEnabled = [TGViewController autorotationAllowed]; [TGViewController disableAutorotation]; [_previewView animateAppear]; } - (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { [super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration]; [self.view.window.layer removeAnimationForKey:@"backgroundColor"]; [CATransaction begin]; [CATransaction setDisableActions:true]; self.view.window.layer.backgroundColor = [UIColor clearColor].CGColor; [CATransaction commit]; for (UIView *view in self.view.window.subviews) { if (view != self.view) { [view removeFromSuperview]; break; } } } - (void)dismiss { if (self.onDismiss != nil) { void (^onDismiss)(void) = [self.onDismiss copy]; self.onDismiss = nil; onDismiss(); } [_previewView animateDismiss:^ { [self dismissImmediately]; }]; } - (void)_handlePanOffset:(CGFloat)offset { [_previewView _handlePanOffset:offset]; } - (void)dismissImmediately { [super dismiss]; if (_autorotationWasEnabled) [TGViewController enableAutorotation]; if (self.onDismiss != nil) self.onDismiss(); } @end