mirror of
https://github.com/danog/Telegram.git
synced 2024-12-03 09:57:46 +01:00
184 lines
5.4 KiB
Objective-C
184 lines
5.4 KiB
Objective-C
/*
|
|
* This is the source code of Telegram for iOS v. 1.1
|
|
* It is licensed under GNU GPL v. 2 or later.
|
|
* You should have received a copy of the license in this archive (see LICENSE).
|
|
*
|
|
* Copyright Peter Iakovlev, 2013.
|
|
*/
|
|
|
|
#import "TGOverlayControllerWindow.h"
|
|
|
|
#import "TGViewController.h"
|
|
#import "TGOverlayController.h"
|
|
|
|
#import "TGAppDelegate.h"
|
|
|
|
@implementation TGOverlayWindowViewController
|
|
|
|
- (UIViewController *)statusBarAppearanceSourceController
|
|
{
|
|
UIViewController *topViewController = TGAppDelegateInstance.rootController.viewControllers.lastObject;
|
|
|
|
if ([topViewController isKindOfClass:[UITabBarController class]])
|
|
topViewController = [(UITabBarController *)topViewController selectedViewController];
|
|
if ([topViewController isKindOfClass:[TGViewController class]])
|
|
{
|
|
TGViewController *concreteTopViewController = (TGViewController *)topViewController;
|
|
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 *topViewController = TGAppDelegateInstance.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 statusBarAppearanceSourceController] prefersStatusBarHidden];
|
|
return value;
|
|
}
|
|
|
|
- (BOOL)shouldAutorotate
|
|
{
|
|
static NSArray *nonRotateableWindowClasses = nil;
|
|
static dispatch_once_t onceToken;
|
|
dispatch_once(&onceToken, ^
|
|
{
|
|
NSMutableArray *array = [[NSMutableArray alloc] init];
|
|
Class alertClass = NSClassFromString(TGEncodeText(@"`VJBmfsuPwfsmbzXjoepx", -1));
|
|
if (alertClass != nil)
|
|
[array addObject:alertClass];
|
|
|
|
nonRotateableWindowClasses = array;
|
|
});
|
|
|
|
for (UIWindow *window in [UIApplication sharedApplication].windows.reverseObjectEnumerator)
|
|
{
|
|
for (Class classInfo in nonRotateableWindowClasses)
|
|
{
|
|
if ([window isKindOfClass:classInfo])
|
|
return false;
|
|
}
|
|
}
|
|
|
|
if (TGAppDelegateInstance.rootController.presentedViewController != nil)
|
|
return [TGAppDelegateInstance.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;
|
|
}
|
|
|
|
@end
|
|
|
|
@implementation TGOverlayControllerWindow
|
|
|
|
- (instancetype)initWithParentController:(TGViewController *)parentController contentController:(TGOverlayController *)contentController
|
|
{
|
|
return [self initWithParentController:parentController contentController:contentController keepKeyboard:false];
|
|
}
|
|
|
|
- (instancetype)initWithParentController:(TGViewController *)parentController contentController:(TGOverlayController *)contentController keepKeyboard:(bool)keepKeyboard
|
|
{
|
|
_keepKeyboard = keepKeyboard;
|
|
|
|
self = [super initWithFrame:TGAppDelegateInstance.rootController.applicationBounds];
|
|
if (self != nil)
|
|
{
|
|
self.windowLevel = UIWindowLevelStatusBar - 0.001f;
|
|
|
|
_parentController = parentController;
|
|
[parentController.associatedWindowStack addObject:self];
|
|
|
|
contentController.overlayWindow = self;
|
|
self.rootViewController = contentController;
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)dealloc
|
|
{
|
|
|
|
}
|
|
|
|
- (void)dismiss
|
|
{
|
|
TGViewController *parentController = _parentController;
|
|
[parentController.associatedWindowStack removeObject:self];
|
|
[self.rootViewController viewWillDisappear:false];
|
|
self.hidden = true;
|
|
[self.rootViewController viewDidDisappear:false];
|
|
self.rootViewController = nil;
|
|
}
|
|
|
|
- (void)setHidden:(BOOL)hidden {
|
|
[super setHidden:hidden];
|
|
|
|
if (!hidden && !_keepKeyboard)
|
|
[TGAppDelegateInstance.window endEditing:true];
|
|
}
|
|
|
|
@end
|