1f67462bcSTomasz Sapeta// Copyright 2015-present 650 Industries. All rights reserved. 2f67462bcSTomasz Sapeta 3f67462bcSTomasz Sapeta#import "EXDevMenuWindow.h" 4f67462bcSTomasz Sapeta#import "EXDevMenuViewController.h" 5f67462bcSTomasz Sapeta#import "EXDevMenuManager.h" 6f67462bcSTomasz Sapeta 7f67462bcSTomasz Sapeta@interface EXDevMenuWindow () 8f67462bcSTomasz Sapeta 9f67462bcSTomasz Sapeta@property (nonatomic, strong) EXDevMenuViewController *viewController; 10f67462bcSTomasz Sapeta 11f67462bcSTomasz Sapeta@end 12f67462bcSTomasz Sapeta 13f67462bcSTomasz Sapeta@implementation EXDevMenuWindow 14f67462bcSTomasz Sapeta 15f67462bcSTomasz Sapeta#pragma mark - UIWindow 16f67462bcSTomasz Sapeta 17f67462bcSTomasz Sapeta- (instancetype)init 18f67462bcSTomasz Sapeta{ 19f67462bcSTomasz Sapeta if (self = [super init]) { 20*59c8df89SEvan Bacon // Set it just above the LogBox so users can easily access it. 21*59c8df89SEvan Bacon // https://github.com/facebook/react-native/blob/0.64-stable/React/CoreModules/RCTLogBoxView.mm#L38 22*59c8df89SEvan Bacon self.windowLevel = UIWindowLevelStatusBar; 23f67462bcSTomasz Sapeta self.backgroundColor = [UIColor clearColor]; 24f67462bcSTomasz Sapeta self.hidden = YES; 25f67462bcSTomasz Sapeta } 26f67462bcSTomasz Sapeta return self; 27f67462bcSTomasz Sapeta} 28f67462bcSTomasz Sapeta 29f67462bcSTomasz Sapeta- (void)makeKeyAndVisible 30f67462bcSTomasz Sapeta{ 31f67462bcSTomasz Sapeta [super makeKeyAndVisible]; 32f67462bcSTomasz Sapeta 33f67462bcSTomasz Sapeta // `makeKeyAndVisible` apparently doesn't call `hidden` setter so make sure the root view is attached. 34f67462bcSTomasz Sapeta [self attachRootViewController]; 35f67462bcSTomasz Sapeta} 36f67462bcSTomasz Sapeta 37f67462bcSTomasz Sapeta- (void)setHidden:(BOOL)hidden 38f67462bcSTomasz Sapeta{ 39f67462bcSTomasz Sapeta [super setHidden:hidden]; 40f67462bcSTomasz Sapeta 41f67462bcSTomasz Sapeta // Reset `rootViewController` so it gets appearing/disappearing events that we depend on. 42f67462bcSTomasz Sapeta if (hidden) { 43f67462bcSTomasz Sapeta [self detachRootViewController]; 44f67462bcSTomasz Sapeta } else { 45f67462bcSTomasz Sapeta [self attachRootViewController]; 46f67462bcSTomasz Sapeta } 47f67462bcSTomasz Sapeta} 48f67462bcSTomasz Sapeta 49f67462bcSTomasz Sapeta#pragma mark - internal 50f67462bcSTomasz Sapeta 51f67462bcSTomasz Sapeta- (void)attachRootViewController 52f67462bcSTomasz Sapeta{ 53f67462bcSTomasz Sapeta if (!_viewController) { 54f67462bcSTomasz Sapeta _viewController = [EXDevMenuViewController new]; 55f67462bcSTomasz Sapeta } 56f67462bcSTomasz Sapeta self.rootViewController = _viewController; 57f67462bcSTomasz Sapeta} 58f67462bcSTomasz Sapeta 59f67462bcSTomasz Sapeta- (void)detachRootViewController 60f67462bcSTomasz Sapeta{ 61f67462bcSTomasz Sapeta self.rootViewController = nil; 62f67462bcSTomasz Sapeta} 63f67462bcSTomasz Sapeta 64f67462bcSTomasz Sapeta@end 65