blob: ccfddd286de3200c5154820c267acaf977813826 [file] [log] [blame]
// Copyright 2018 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/chrome/browser/ui/sad_tab/sad_tab_view_controller.h"
#include <CoreGraphics/CoreGraphics.h>
#import "ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.h"
#import "ios/chrome/browser/ui/sad_tab/sad_tab_view.h"
#import "ios/chrome/browser/ui/util/uikit_ui_util.h"
#import "ios/chrome/common/ui_util/constraints_ui_util.h"
#include "url/gurl.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
@interface SadTabViewController ()<SadTabViewDelegate>
@property(nonatomic) SadTabView* sadTabView;
// Scroll view is required by OverscrollActionsController and will be a parent
// view of the sad tab view.
@property(nonatomic) UIScrollView* scrollView;
// Allows supporting Overscroll Actions UI, which is displayed when Sad Tab is
// pulled down.
@property(nonatomic) OverscrollActionsController* overscrollActionsController;
@end
@implementation SadTabViewController
@synthesize repeatedFailure = _repeatedFailure;
@synthesize offTheRecord = _offTheRecord;
@synthesize sadTabView = _sadTabView;
@synthesize scrollView = _scrollView;
@synthesize overscrollActionsController = _overscrollActionsController;
@synthesize overscrollDelegate = _overscrollDelegate;
#pragma mark - UIViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Scroll view is required by OverscrollActionsController and will be a parent
// view of the sad tab view.
self.scrollView = [[UIScrollView alloc] init];
self.scrollView.showsVerticalScrollIndicator = NO;
[self.view addSubview:self.scrollView];
self.scrollView.translatesAutoresizingMaskIntoConstraints = NO;
AddSameConstraints(self.scrollView, self.view);
// SadTabView is a child of the scroll view as reqired by
// OverscrollActionsController.
SadTabViewMode mode =
self.repeatedFailure ? SadTabViewMode::FEEDBACK : SadTabViewMode::RELOAD;
self.sadTabView =
[[SadTabView alloc] initWithMode:mode offTheRecord:self.offTheRecord];
self.sadTabView.delegate = self;
[self.scrollView addSubview:self.sadTabView];
// OverscrollActionsController allows Overscroll Actions UI.
self.overscrollActionsController =
[[OverscrollActionsController alloc] initWithScrollView:self.scrollView];
self.overscrollActionsController.delegate = self.overscrollDelegate;
self.scrollView.delegate = self.overscrollActionsController;
OverscrollStyle style = self.offTheRecord
? OverscrollStyle::REGULAR_PAGE_INCOGNITO
: OverscrollStyle::REGULAR_PAGE_NON_INCOGNITO;
[self.overscrollActionsController setStyle:style];
[self updateOverscrollActionsState];
}
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
// In order to allow UIScollView to scroll vertically, the height of the
// content should be taller than the hight of the scroll view.
CGRect newFrame = self.view.bounds;
newFrame.size.height += 1;
self.sadTabView.frame = newFrame;
[self.scrollView setContentSize:newFrame.size];
}
- (void)traitCollectionDidChange:(UITraitCollection*)previousTraitCollection {
[super traitCollectionDidChange:previousTraitCollection];
[self updateOverscrollActionsState];
}
#pragma mark - SadTabViewDelegate
- (void)sadTabViewShowReportAnIssue:(SadTabView*)sadTabView {
[self.delegate sadTabViewControllerShowReportAnIssue:self];
}
- (void)sadTabView:(SadTabView*)sadTabView
showSuggestionsPageWithURL:(const GURL&)URL {
[self.delegate sadTabViewController:self showSuggestionsPageWithURL:URL];
}
- (void)sadTabViewReload:(SadTabView*)sadTabView {
[self.delegate sadTabViewControllerReload:self];
}
#pragma mark - Private
// Enables or disables overscroll actions.
- (void)updateOverscrollActionsState {
if (IsSplitToolbarMode(self)) {
[self.overscrollActionsController enableOverscrollActions];
} else {
[self.overscrollActionsController disableOverscrollActions];
}
}
@end
#pragma mark -
@implementation SadTabViewController (UIElements)
- (UITextView*)messageTextView {
return self.sadTabView.messageTextView;
}
- (UIButton*)actionButton {
return self.sadTabView.actionButton;
}
@end