Commit b546938b authored by Kurt Horimoto's avatar Kurt Horimoto Committed by Commit Bot

[iOS] Use non-modal contained presenter for app launcher dialogs

App launcher dialogs are now presented as child view controllers.  This
allows for usage of NonModalViewControllerPresenter, which has the
durations provided by UX.

Also, since the view controllers can be presented immediately, this
CL also prevents the flicker from occurring when exiting the tab
switcher by avoiding the asynchronicity of view controller
presentation.

Bug: 979030, 999960, 999962
Change-Id: I8b2c967e9cbe393f107bcfb68124ed9f214a7125
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1788246
Commit-Queue: Kurt Horimoto <kkhorimoto@chromium.org>
Reviewed-by: default avatarMike Dougherty <michaeldo@chromium.org>
Cr-Commit-Position: refs/heads/master@{#696965}
parent 644f775e
...@@ -22,6 +22,7 @@ source_set("app_launcher") { ...@@ -22,6 +22,7 @@ source_set("app_launcher") {
"//ios/chrome/browser/ui/alert_view_controller", "//ios/chrome/browser/ui/alert_view_controller",
"//ios/chrome/browser/ui/elements", "//ios/chrome/browser/ui/elements",
"//ios/chrome/browser/ui/overlays:coordinators", "//ios/chrome/browser/ui/overlays:coordinators",
"//ios/chrome/browser/ui/presenters",
"//ui/base", "//ui/base",
] ]
} }
......
...@@ -9,17 +9,21 @@ ...@@ -9,17 +9,21 @@
#import "ios/chrome/browser/ui/alert_view_controller/alert_view_controller.h" #import "ios/chrome/browser/ui/alert_view_controller/alert_view_controller.h"
#import "ios/chrome/browser/ui/overlays/overlay_request_coordinator_delegate.h" #import "ios/chrome/browser/ui/overlays/overlay_request_coordinator_delegate.h"
#import "ios/chrome/browser/ui/overlays/web_content_area/app_launcher/app_launcher_alert_overlay_mediator.h" #import "ios/chrome/browser/ui/overlays/web_content_area/app_launcher/app_launcher_alert_overlay_mediator.h"
#import "ios/chrome/browser/ui/presenters/contained_presenter_delegate.h"
#import "ios/chrome/browser/ui/presenters/non_modal_view_controller_presenter.h"
#if !defined(__has_feature) || !__has_feature(objc_arc) #if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support." #error "This file requires ARC support."
#endif #endif
@interface AppLauncherAlertOverlayCoordinator () < @interface AppLauncherAlertOverlayCoordinator () <
AppLauncherAlertOverlayMediatorDelegate> AppLauncherAlertOverlayMediatorDelegate,
ContainedPresenterDelegate>
// Whether the coordinator has been started. // Whether the coordinator has been started.
@property(nonatomic, getter=isStarted) BOOL started; @property(nonatomic, getter=isStarted) BOOL started;
@property(nonatomic) AlertViewController* alertViewController; @property(nonatomic) AlertViewController* alertViewController;
@property(nonatomic) NonModalViewControllerPresenter* presenter;
@property(nonatomic) AppLauncherAlertOverlayMediator* mediator; @property(nonatomic) AppLauncherAlertOverlayMediator* mediator;
@end @end
...@@ -42,12 +46,28 @@ ...@@ -42,12 +46,28 @@
[self stopAnimated:YES]; [self stopAnimated:YES];
} }
#pragma mark - ContainedPresenterDelegate
- (void)containedPresenterDidPresent:(id<ContainedPresenter>)presenter {
self.delegate->OverlayUIDidFinishPresentation(self.request);
}
- (void)containedPresenterDidDismiss:(id<ContainedPresenter>)presenter {
self.alertViewController = nil;
self.presenter = nil;
self.delegate->OverlayUIDidFinishDismissal(self.request);
}
#pragma mark - OverlayCoordinator #pragma mark - OverlayCoordinator
+ (BOOL)supportsRequest:(OverlayRequest*)request { + (BOOL)supportsRequest:(OverlayRequest*)request {
return !!request->GetConfig<AppLauncherAlertOverlayRequestConfig>(); return !!request->GetConfig<AppLauncherAlertOverlayRequestConfig>();
} }
+ (BOOL)usesChildViewController {
return YES;
}
- (UIViewController*)viewController { - (UIViewController*)viewController {
return self.alertViewController; return self.alertViewController;
} }
...@@ -63,31 +83,19 @@ ...@@ -63,31 +83,19 @@
self.mediator = self.mediator =
[[AppLauncherAlertOverlayMediator alloc] initWithRequest:self.request]; [[AppLauncherAlertOverlayMediator alloc] initWithRequest:self.request];
self.mediator.consumer = self.alertViewController; self.mediator.consumer = self.alertViewController;
__weak __typeof__(self) weakSelf = self; self.presenter = [[NonModalViewControllerPresenter alloc] init];
[self.baseViewController self.presenter.delegate = self;
presentViewController:self.alertViewController self.presenter.baseViewController = self.baseViewController;
animated:animated self.presenter.presentedViewController = self.alertViewController;
completion:^{ [self.presenter prepareForPresentation];
weakSelf.delegate->OverlayUIDidFinishPresentation( [self.presenter presentAnimated:animated];
weakSelf.request);
}];
self.started = YES; self.started = YES;
} }
- (void)stopAnimated:(BOOL)animated { - (void)stopAnimated:(BOOL)animated {
if (!self.started) if (!self.started)
return; return;
__weak __typeof__(self) weakSelf = self; [self.presenter dismissAnimated:animated];
[self.baseViewController
dismissViewControllerAnimated:animated
completion:^{
__typeof__(self) strongSelf = weakSelf;
if (!strongSelf)
return;
strongSelf.alertViewController = nil;
strongSelf.delegate->OverlayUIDidFinishDismissal(
weakSelf.request);
}];
self.started = NO; self.started = NO;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment