blob: 5ec82809e6a086a31414db80bf1b9a4e8234b31c [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "ios/showcase/infobars/sc_infobar_banner_coordinator.h"
#import "ios/chrome/browser/infobars/infobar_type.h"
#import "ios/chrome/browser/ui/infobars/banners/infobar_banner_delegate.h"
#import "ios/chrome/browser/ui/infobars/banners/infobar_banner_view_controller.h"
#import "ios/chrome/browser/ui/infobars/modals/infobar_modal_delegate.h"
#import "ios/chrome/browser/ui/infobars/modals/infobar_modal_view_controller.h"
#import "ios/chrome/browser/ui/infobars/presentation/infobar_banner_positioner.h"
#import "ios/chrome/browser/ui/infobars/presentation/infobar_banner_transition_driver.h"
#import "ios/chrome/browser/ui/infobars/presentation/infobar_modal_positioner.h"
#import "ios/chrome/browser/ui/infobars/presentation/infobar_modal_transition_driver.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
NSString* const kInfobarBannerTitleLabel = @"Test Infobar";
NSString* const kInfobarBannerSubtitleLabel = @"This a test Infobar.";
NSString* const kInfobarBannerButtonLabel = @"Accept";
NSString* const kInfobarBannerPresentedModalLabel = @"Modal Infobar";
#pragma mark - ContainerViewController
@interface ContainerViewController
: UIViewController <InfobarBannerPositioner, InfobarModalPositioner>
@property(nonatomic, strong) InfobarBannerViewController* bannerViewController;
@property(nonatomic, strong)
InfobarBannerTransitionDriver* bannerTransitionDriver;
@end
@implementation ContainerViewController
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[self.bannerViewController
setModalPresentationStyle:UIModalPresentationCustom];
self.bannerTransitionDriver = [[InfobarBannerTransitionDriver alloc] init];
self.bannerTransitionDriver.bannerPositioner = self;
self.bannerViewController.transitioningDelegate = self.bannerTransitionDriver;
[self presentViewController:self.bannerViewController
animated:YES
completion:nil];
}
#pragma mark InfobarBannerPositioner
- (CGFloat)bannerYPosition {
return 100;
}
- (UIView*)bannerView {
return self.bannerViewController.view;
}
#pragma mark InfobarBannerPositioner
- (CGFloat)modalHeightForWidth:(CGFloat)width {
return 200;
}
@end
#pragma mark - SCInfobarBannerCoordinator
@interface SCInfobarBannerCoordinator () <InfobarBannerDelegate,
InfobarModalDelegate>
@property(nonatomic, strong) InfobarBannerViewController* bannerViewController;
@property(nonatomic, strong) ContainerViewController* containerViewController;
@property(nonatomic, strong)
InfobarModalTransitionDriver* modalTransitionDriver;
@property(nonatomic, strong) InfobarModalViewController* modalViewController;
@end
@implementation SCInfobarBannerCoordinator
@synthesize baseViewController = _baseViewController;
- (void)start {
self.containerViewController = [[ContainerViewController alloc] init];
UIView* containerView = self.containerViewController.view;
containerView.backgroundColor = [UIColor whiteColor];
self.containerViewController.title = @"Infobar Messages";
self.bannerViewController = [[InfobarBannerViewController alloc]
initWithDelegate:self
type:InfobarType::kInfobarTypeConfirm];
self.bannerViewController.titleText = kInfobarBannerTitleLabel;
self.bannerViewController.subTitleText = kInfobarBannerSubtitleLabel;
self.bannerViewController.buttonText = kInfobarBannerButtonLabel;
self.containerViewController.bannerViewController = self.bannerViewController;
[self.baseViewController pushViewController:self.containerViewController
animated:YES];
}
- (void)dealloc {
[self dismissInfobarBanner:nil animated:YES completion:nil];
}
#pragma mark InfobarBannerDelegate
- (void)bannerInfobarButtonWasPressed:(id)sender {
[self dismissInfobarBanner:nil animated:YES completion:nil];
}
- (void)presentInfobarModalFromBanner {
self.modalTransitionDriver = [[InfobarModalTransitionDriver alloc]
initWithTransitionMode:InfobarModalTransitionBanner];
self.modalTransitionDriver.modalPositioner = self.containerViewController;
self.modalViewController =
[[InfobarModalViewController alloc] initWithModalDelegate:self];
self.modalViewController.title = kInfobarBannerPresentedModalLabel;
UINavigationController* navController = [[UINavigationController alloc]
initWithRootViewController:self.modalViewController];
navController.transitioningDelegate = self.modalTransitionDriver;
navController.modalPresentationStyle = UIModalPresentationCustom;
[self.bannerViewController presentViewController:navController
animated:YES
completion:nil];
}
- (void)dismissInfobarBanner:(id)sender
animated:(BOOL)animated
completion:(ProceduralBlock)completion {
[self.baseViewController dismissViewControllerAnimated:animated
completion:nil];
}
- (void)infobarBannerWasDismissed {
self.bannerViewController = nil;
}
#pragma mark InfobarModalDelegate
- (void)modalInfobarButtonWasAccepted:(id)sender {
[self dismissInfobarModal:sender animated:YES completion:nil];
}
- (void)dismissInfobarModal:(UIButton*)sender
animated:(BOOL)animated
completion:(ProceduralBlock)completion {
[self.baseViewController dismissViewControllerAnimated:animated
completion:nil];
}
- (void)modalInfobarWasDismissed:(id)sender {
}
@end