Files
firebase-ios-sdk/Firebase/Auth/Source/Utilities/FIRAuthDefaultUIDelegate.m
T

121 lines
4.0 KiB
Objective-C
Raw Normal View History

2017-09-01 13:38:12 -07:00
/*
* Copyright 2017 Google
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
2019-12-16 11:27:48 -08:00
#include <TargetConditionals.h>
#if !TARGET_OS_OSX
#import "FIRAuthDefaultUIDelegate.h"
2017-09-01 13:38:12 -07:00
#import <GoogleUtilities/GULAppEnvironmentUtil.h>
2019-02-22 21:23:17 -08:00
#import <UIKit/UIKit.h>
2018-05-30 17:59:18 -07:00
2017-09-01 13:38:12 -07:00
NS_ASSUME_NONNULL_BEGIN
@interface FIRAuthDefaultUIDelegate ()
2017-09-01 13:38:12 -07:00
/** @fn initWithViewController:
@brief Initializes the instance with a view controller.
@param viewController The view controller as the presenting view controller in @c
FIRAuthUIDelegate.
2017-09-01 13:38:12 -07:00
@return The initialized instance.
*/
2018-08-24 07:09:56 -07:00
- (instancetype)initWithViewController:(nullable UIViewController *)viewController NS_DESIGNATED_INITIALIZER;
2017-09-01 13:38:12 -07:00
@end
@implementation FIRAuthDefaultUIDelegate {
/** @var _viewController
@brief The presenting view controller.
*/
UIViewController *_viewController;
}
2018-08-24 07:09:56 -07:00
- (instancetype)initWithViewController:(nullable UIViewController *)viewController {
2017-09-01 13:38:12 -07:00
self = [super init];
if (self) {
_viewController = viewController;
}
return self;
}
- (void)presentViewController:(UIViewController *)viewControllerToPresent
animated:(BOOL)flag
completion:(nullable void (^)(void))completion {
[_viewController presentViewController:viewControllerToPresent
animated:flag
completion:completion];
}
- (void)dismissViewControllerAnimated:(BOOL)flag completion:(nullable void (^)(void))completion {
[_viewController dismissViewControllerAnimated:flag completion:completion];
}
+ (id<FIRAuthUIDelegate>)defaultUIDelegate {
2018-05-30 17:59:18 -07:00
// iOS App extensions should not call [UIApplication sharedApplication], even if UIApplication
// responds to it.
static Class applicationClass = nil;
if (![GULAppEnvironmentUtil isAppExtension]) {
2018-05-30 17:59:18 -07:00
Class cls = NSClassFromString(@"UIApplication");
if (cls && [cls respondsToSelector:NSSelectorFromString(@"sharedApplication")]) {
applicationClass = cls;
}
}
UIViewController *topViewController;
2019-10-16 14:33:56 -07:00
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000
if (@available(iOS 13.0, tvOS 13.0, *)) {
UIApplication *application = [applicationClass sharedApplication];
NSSet<UIScene *> * connectedScenes = application.connectedScenes;
for (UIScene *scene in connectedScenes) {
if ([scene isKindOfClass:[UIWindowScene class]]) {
UIWindowScene *windowScene = (UIWindowScene *)scene;
for (UIWindow *window in windowScene.windows) {
if (window.isKeyWindow) {
topViewController = window.rootViewController;
}
}
}
}
2019-10-16 17:04:33 -07:00
} else {
UIApplication *application = [applicationClass sharedApplication];
topViewController = application.keyWindow.rootViewController;
}
2019-10-16 17:04:33 -07:00
#else
UIApplication *application = [applicationClass sharedApplication];
topViewController = application.keyWindow.rootViewController;
2019-10-16 14:33:56 -07:00
#endif
2017-09-01 13:38:12 -07:00
while (true){
if (topViewController.presentedViewController) {
topViewController = topViewController.presentedViewController;
} else if ([topViewController isKindOfClass:[UINavigationController class]]) {
UINavigationController *nav = (UINavigationController *)topViewController;
topViewController = nav.topViewController;
} else if ([topViewController isKindOfClass:[UITabBarController class]]) {
UITabBarController *tab = (UITabBarController *)topViewController;
topViewController = tab.selectedViewController;
} else {
break;
}
}
return [[FIRAuthDefaultUIDelegate alloc] initWithViewController:topViewController];
}
@end
NS_ASSUME_NONNULL_END
2019-12-16 11:27:48 -08:00
#endif