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") {
"//ios/chrome/browser/ui/alert_view_controller",
"//ios/chrome/browser/ui/elements",
"//ios/chrome/browser/ui/overlays:coordinators",
"//ios/chrome/browser/ui/presenters",
"//ui/base",
]
}
......
......@@ -9,17 +9,21 @@
#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/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)
#error "This file requires ARC support."
#endif
@interface AppLauncherAlertOverlayCoordinator () <
AppLauncherAlertOverlayMediatorDelegate>
AppLauncherAlertOverlayMediatorDelegate,
ContainedPresenterDelegate>
// Whether the coordinator has been started.
@property(nonatomic, getter=isStarted) BOOL started;
@property(nonatomic) AlertViewController* alertViewController;
@property(nonatomic) NonModalViewControllerPresenter* presenter;
@property(nonatomic) AppLauncherAlertOverlayMediator* mediator;
@end
......@@ -42,12 +46,28 @@
[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
+ (BOOL)supportsRequest:(OverlayRequest*)request {
return !!request->GetConfig<AppLauncherAlertOverlayRequestConfig>();
}
+ (BOOL)usesChildViewController {
return YES;
}
- (UIViewController*)viewController {
return self.alertViewController;
}
......@@ -63,31 +83,19 @@
self.mediator =
[[AppLauncherAlertOverlayMediator alloc] initWithRequest:self.request];
self.mediator.consumer = self.alertViewController;
__weak __typeof__(self) weakSelf = self;
[self.baseViewController
presentViewController:self.alertViewController
animated:animated
completion:^{
weakSelf.delegate->OverlayUIDidFinishPresentation(
weakSelf.request);
}];
self.presenter = [[NonModalViewControllerPresenter alloc] init];
self.presenter.delegate = self;
self.presenter.baseViewController = self.baseViewController;
self.presenter.presentedViewController = self.alertViewController;
[self.presenter prepareForPresentation];
[self.presenter presentAnimated:animated];
self.started = YES;
}
- (void)stopAnimated:(BOOL)animated {
if (!self.started)
return;
__weak __typeof__(self) weakSelf = self;
[self.baseViewController
dismissViewControllerAnimated:animated
completion:^{
__typeof__(self) strongSelf = weakSelf;
if (!strongSelf)
return;
strongSelf.alertViewController = nil;
strongSelf.delegate->OverlayUIDidFinishDismissal(
weakSelf.request);
}];
[self.presenter dismissAnimated:animated];
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