blob: 3daca0407a3e9d9db9f15d8711d5548d0777e27b [file] [log] [blame]
// Copyright 2017 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/fullscreen/fullscreen_controller_impl.h"
#import "ios/chrome/browser/ui/broadcaster/chrome_broadcast_observer_bridge.h"
#import "ios/chrome/browser/ui/broadcaster/chrome_broadcaster.h"
#import "ios/chrome/browser/ui/fullscreen/fullscreen_system_notification_observer.h"
#include "ios/public/provider/chrome/browser/chrome_browser_provider.h"
#import "ios/public/provider/chrome/browser/ui/fullscreen_provider.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
FullscreenControllerImpl::FullscreenControllerImpl()
: FullscreenController(),
broadcaster_([[ChromeBroadcaster alloc] init]),
mediator_(this, &model_),
web_state_list_observer_(this, &model_, &mediator_),
bridge_([[ChromeBroadcastOberverBridge alloc] initWithObserver:&model_]),
notification_observer_([[FullscreenSystemNotificationObserver alloc]
initWithController:this
mediator:&mediator_]) {
DCHECK(broadcaster_);
[broadcaster_ addObserver:bridge_
forSelector:@selector(broadcastScrollViewSize:)];
[broadcaster_ addObserver:bridge_
forSelector:@selector(broadcastScrollViewContentSize:)];
[broadcaster_ addObserver:bridge_
forSelector:@selector(broadcastScrollViewContentInset:)];
[broadcaster_ addObserver:bridge_
forSelector:@selector(broadcastContentScrollOffset:)];
[broadcaster_ addObserver:bridge_
forSelector:@selector(broadcastScrollViewIsScrolling:)];
[broadcaster_ addObserver:bridge_
forSelector:@selector(broadcastScrollViewIsZooming:)];
[broadcaster_ addObserver:bridge_
forSelector:@selector(broadcastScrollViewIsDragging:)];
[broadcaster_ addObserver:bridge_
forSelector:@selector(broadcastCollapsedToolbarHeight:)];
[broadcaster_ addObserver:bridge_
forSelector:@selector(broadcastExpandedToolbarHeight:)];
[broadcaster_ addObserver:bridge_
forSelector:@selector(broadcastBottomToolbarHeight:)];
ios::GetChromeBrowserProvider()
->GetFullscreenProvider()
->InitializeFullscreen(this);
}
FullscreenControllerImpl::~FullscreenControllerImpl() = default;
ChromeBroadcaster* FullscreenControllerImpl::broadcaster() {
return broadcaster_;
}
void FullscreenControllerImpl::SetWebStateList(WebStateList* web_state_list) {
web_state_list_observer_.SetWebStateList(web_state_list);
}
const WebStateList* FullscreenControllerImpl::GetWebStateList() const {
return web_state_list_observer_.GetWebStateList();
}
WebStateList* FullscreenControllerImpl::GetWebStateList() {
return web_state_list_observer_.GetWebStateList();
}
void FullscreenControllerImpl::AddObserver(
FullscreenControllerObserver* observer) {
mediator_.AddObserver(observer);
}
void FullscreenControllerImpl::RemoveObserver(
FullscreenControllerObserver* observer) {
mediator_.RemoveObserver(observer);
}
bool FullscreenControllerImpl::IsEnabled() const {
return model_.enabled();
}
void FullscreenControllerImpl::IncrementDisabledCounter() {
model_.IncrementDisabledCounter();
}
void FullscreenControllerImpl::DecrementDisabledCounter() {
model_.DecrementDisabledCounter();
}
void FullscreenControllerImpl::BrowserTraitCollectionChangedBegin() {
mediator_.StopFrameChangeCompensation();
}
void FullscreenControllerImpl::BrowserTraitCollectionChangedEnd() {
mediator_.StartFrameChangeCompensation();
}
CGFloat FullscreenControllerImpl::GetProgress() const {
return model_.progress();
}
UIEdgeInsets FullscreenControllerImpl::GetMinViewportInsets() const {
return model_.min_toolbar_insets();
}
UIEdgeInsets FullscreenControllerImpl::GetMaxViewportInsets() const {
return model_.max_toolbar_insets();
}
UIEdgeInsets FullscreenControllerImpl::GetCurrentViewportInsets() const {
return model_.current_toolbar_insets();
}
void FullscreenControllerImpl::EnterFullscreen() {
mediator_.EnterFullscreen();
}
void FullscreenControllerImpl::ExitFullscreen() {
mediator_.ExitFullscreen();
}
void FullscreenControllerImpl::Shutdown() {
mediator_.Disconnect();
web_state_list_observer_.Disconnect();
[notification_observer_ disconnect];
[broadcaster_ removeObserver:bridge_
forSelector:@selector(broadcastScrollViewSize:)];
[broadcaster_ removeObserver:bridge_
forSelector:@selector(broadcastScrollViewContentSize:)];
[broadcaster_ removeObserver:bridge_
forSelector:@selector(broadcastScrollViewContentInset:)];
[broadcaster_ removeObserver:bridge_
forSelector:@selector(broadcastContentScrollOffset:)];
[broadcaster_ removeObserver:bridge_
forSelector:@selector(broadcastScrollViewIsScrolling:)];
[broadcaster_ removeObserver:bridge_
forSelector:@selector(broadcastScrollViewIsZooming:)];
[broadcaster_ removeObserver:bridge_
forSelector:@selector(broadcastScrollViewIsDragging:)];
[broadcaster_ removeObserver:bridge_
forSelector:@selector(broadcastCollapsedToolbarHeight:)];
[broadcaster_ removeObserver:bridge_
forSelector:@selector(broadcastExpandedToolbarHeight:)];
[broadcaster_ removeObserver:bridge_
forSelector:@selector(broadcastBottomToolbarHeight:)];
}