mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
226 lines
7.2 KiB
Objective-C
226 lines
7.2 KiB
Objective-C
#import "TGOverlayControllerWindow.h"
|
|
|
|
#import "LegacyComponentsInternal.h"
|
|
#import "TGHacks.h"
|
|
|
|
#import "TGViewController.h"
|
|
#import "TGOverlayController.h"
|
|
|
|
@implementation TGOverlayWindowViewController
|
|
|
|
- (UIViewController *)statusBarAppearanceSourceController
|
|
{
|
|
UIViewController *rootController = [[LegacyComponentsGlobals provider] applicationWindows].firstObject.rootViewController;
|
|
UIViewController *topViewController = nil;
|
|
if ([rootController respondsToSelector:@selector(viewControllers)]) {
|
|
topViewController = [(UINavigationController *)rootController viewControllers].lastObject;
|
|
}
|
|
|
|
if ([topViewController isKindOfClass:[UITabBarController class]])
|
|
topViewController = [(UITabBarController *)topViewController selectedViewController];
|
|
if ([topViewController isKindOfClass:[TGViewController class]])
|
|
{
|
|
TGViewController *concreteTopViewController = (TGViewController *)topViewController;
|
|
if (concreteTopViewController.presentedViewController != nil)
|
|
{
|
|
topViewController = concreteTopViewController.presentedViewController;
|
|
}
|
|
else if (concreteTopViewController.associatedWindowStack.count != 0)
|
|
{
|
|
for (UIWindow *window in concreteTopViewController.associatedWindowStack.reverseObjectEnumerator)
|
|
{
|
|
if (window.rootViewController != nil && window.rootViewController != self)
|
|
{
|
|
topViewController = window.rootViewController;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return topViewController;
|
|
}
|
|
|
|
- (UIViewController *)autorotationSourceController
|
|
{
|
|
UIViewController *rootController = [[LegacyComponentsGlobals provider] applicationWindows].firstObject.rootViewController;
|
|
UIViewController *topViewController = nil;
|
|
if ([rootController respondsToSelector:@selector(viewControllers)]) {
|
|
topViewController = [(UINavigationController *)rootController viewControllers].lastObject;
|
|
}
|
|
|
|
if ([topViewController isKindOfClass:[UITabBarController class]])
|
|
topViewController = [(UITabBarController *)topViewController selectedViewController];
|
|
|
|
return topViewController;
|
|
}
|
|
|
|
- (UIStatusBarStyle)preferredStatusBarStyle
|
|
{
|
|
UIStatusBarStyle style = [[self statusBarAppearanceSourceController] preferredStatusBarStyle];
|
|
return style;
|
|
}
|
|
|
|
- (BOOL)prefersStatusBarHidden
|
|
{
|
|
bool value = self.forceStatusBarHidden || [[self statusBarAppearanceSourceController] prefersStatusBarHidden];
|
|
return value;
|
|
}
|
|
|
|
- (BOOL)shouldAutorotate
|
|
{
|
|
UIViewController *rootController = [[LegacyComponentsGlobals provider] applicationWindows].firstObject.rootViewController;
|
|
|
|
if (rootController.presentedViewController != nil)
|
|
return [rootController.presentedViewController shouldAutorotate];
|
|
|
|
if ([self autorotationSourceController] != nil)
|
|
return [[self autorotationSourceController] shouldAutorotate];
|
|
|
|
return true;
|
|
}
|
|
|
|
- (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)loadView
|
|
{
|
|
[super loadView];
|
|
|
|
self.view.userInteractionEnabled = false;
|
|
self.view.opaque = false;
|
|
self.view.backgroundColor = [UIColor clearColor];
|
|
}
|
|
|
|
@end
|
|
|
|
|
|
@interface TGOverlayControllerWindow ()
|
|
{
|
|
__weak TGViewController *_parentController;
|
|
id<LegacyComponentsOverlayWindowManager> _manager;
|
|
bool _managedIsHidden;
|
|
TGOverlayController *_contentController;
|
|
}
|
|
|
|
@end
|
|
|
|
@implementation TGOverlayControllerWindow
|
|
|
|
- (instancetype)initWithManager:(id<LegacyComponentsOverlayWindowManager>)manager parentController:(TGViewController *)parentController contentController:(TGOverlayController *)contentController
|
|
{
|
|
return [self initWithManager:manager parentController:parentController contentController:contentController keepKeyboard:false];
|
|
}
|
|
|
|
- (instancetype)initWithManager:(id<LegacyComponentsOverlayWindowManager>)manager parentController:(TGViewController *)parentController contentController:(TGOverlayController *)contentController keepKeyboard:(bool)keepKeyboard
|
|
{
|
|
assert(manager != nil);
|
|
|
|
if (self != nil) {
|
|
_keepKeyboard = keepKeyboard;
|
|
_manager = manager;
|
|
_managedIsHidden = true;
|
|
}
|
|
|
|
self = [super initWithFrame:[[_manager context] fullscreenBounds]];
|
|
if (self != nil)
|
|
{
|
|
self.frame = [[_manager context] fullscreenBounds];
|
|
self.windowLevel = UIWindowLevelStatusBar - 0.001f;
|
|
|
|
_parentController = parentController;
|
|
[parentController.associatedWindowStack addObject:self];
|
|
|
|
if ([_manager managesWindow]) {
|
|
_contentController = contentController;
|
|
__weak TGOverlayControllerWindow *weakSelf = self;
|
|
__weak TGViewController *weakParentController = parentController;
|
|
contentController.customDismissBlock = ^{
|
|
__strong TGOverlayControllerWindow *strongSelf = weakSelf;
|
|
__strong TGViewController *strongParentController = weakParentController;
|
|
[strongParentController.associatedWindowStack removeObject:strongSelf];
|
|
[manager setHidden:true window:strongSelf];
|
|
};
|
|
[_manager bindController:contentController];
|
|
} else {
|
|
contentController.overlayWindow = self;
|
|
self.rootViewController = contentController;
|
|
}
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)dealloc
|
|
{
|
|
_manager = nil;
|
|
}
|
|
|
|
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
|
|
{
|
|
return [super hitTest:point withEvent:event];
|
|
}
|
|
|
|
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
|
|
{
|
|
if (iosMajorVersion() < 8 && !self.hidden)
|
|
return true;
|
|
|
|
return [super pointInside:point withEvent:event];
|
|
}
|
|
|
|
- (void)dismiss
|
|
{
|
|
TGViewController *parentController = _parentController;
|
|
[parentController.associatedWindowStack removeObject:self];
|
|
[self.rootViewController viewWillDisappear:false];
|
|
self.hidden = true;
|
|
[self.rootViewController viewDidDisappear:false];
|
|
self.rootViewController = nil;
|
|
}
|
|
|
|
- (BOOL)isHidden {
|
|
if ([_manager managesWindow]) {
|
|
return _managedIsHidden;
|
|
} else {
|
|
return [super isHidden];
|
|
}
|
|
}
|
|
|
|
- (void)setHidden:(BOOL)hidden {
|
|
if ([_manager managesWindow]) {
|
|
if (![super isHidden]) {
|
|
[super setHidden:true];
|
|
}
|
|
|
|
if (_managedIsHidden != hidden) {
|
|
_managedIsHidden = hidden;
|
|
[_manager setHidden:hidden window:self];
|
|
}
|
|
} else {
|
|
[super setHidden:hidden];
|
|
|
|
if (!hidden && !_keepKeyboard) {
|
|
[[[LegacyComponentsGlobals provider] applicationWindows].firstObject endEditing:true];
|
|
}
|
|
}
|
|
}
|
|
|
|
@end
|