blob: 7ab189068a25b20a07cfded6918a6ba132c5d865 [file] [log] [blame]
// Copyright 2013 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.
#ifndef IOS_CHROME_BROWSER_UI_FULLSCREEN_LEGACY_FULLSCREEN_CONTROLLER_H_
#define IOS_CHROME_BROWSER_UI_FULLSCREEN_LEGACY_FULLSCREEN_CONTROLLER_H_
#import <UIKit/UIKit.h>
#import "ios/web/public/web_state/ui/crw_web_view_proxy.h"
#import "ios/web/public/web_state/ui/crw_web_view_scroll_view_proxy.h"
@class CRWWebViewScrollViewProxy;
@class LegacyFullscreenController;
namespace web {
class WebState;
}
// Notification when the application is set up for testing.
extern NSString* const kSetupForTestingWillCloseAllTabsNotification;
@protocol LegacyFullscreenControllerDelegate<NSObject>
@required
// Called every time the header view needs to be moved in place according to
// the offset. The offset is a value between 0.0 (fully visible) and
// headerHeight (fully hidden). If animate is YES it is preferable for the
// delegate to slide the view in place instead of simply snapping it there. If
// animate is NO the view tracks touches on the screen and as such should be
// immediate.
- (void)fullScreenController:(LegacyFullscreenController*)fullscreenController
drawHeaderViewFromOffset:(CGFloat)headerOffset
animate:(BOOL)animate;
// Called when there is a need to move the header in place and scroll the
// webViewProxy's scroll view at the same time. Should always be animated.
// Only happens during a call to -setHeaderHeight:visible:onScrollView:. If
// |changeTopContentPadding| is YES, then in addition to scrolling, delegate
// should also update webViewProxy's topContentPadding.
- (void)fullScreenController:(LegacyFullscreenController*)fullScreenController
drawHeaderViewFromOffset:(CGFloat)headerOffset
onWebViewProxy:(id<CRWWebViewProxy>)webViewProxy
changeTopContentPadding:(BOOL)changeTopContentPadding
scrollingToOffset:(CGFloat)contentOffset;
// Called to retrieve the current height of the header. Only called from
// -setHeaderVisible:, so that method needs to be explicitly called when the
// height changes.
- (CGFloat)headerHeightForLegacyFullscreen;
// Tests if the session ID matches the current tab.
- (BOOL)isTabWithIDCurrent:(NSString*)sessionID;
// Current offset of the header. A value between 0.0 (fully visible) and
// headerHeight (fully hidden).
- (CGFloat)currentHeaderOffset;
// Redraw the header. Called when no adjustment of the header is necessary, but
// a navigation had happened that might have affected the header's visiblity.
- (void)redrawHeader;
@end
// This class will track a scrollview to make a header disappear on scroll down
// and reappear on scroll up. This class expects the scrollview to have the
// LegacyFullscreenController instance set as an observer right after the call
// to -initWithDelegate:scrollView:
//
// It also assumes the header is a view rendering itself on top of the scroll
// view, the delegate will simply move it out of view as needed. The delegate is
// called every time the header view needs to be moved.
@interface LegacyFullscreenController
: NSObject<CRWWebViewScrollViewProxyObserver>
// If set to YES this slightly alters the behaviour on drag down to pull the
// header to visible on the fist pixel moved. If set to NO (the default) there
// is a slight threshold before activating.
@property(nonatomic, assign) BOOL immediateDragDown;
// Designated initializer.
- (id)initWithDelegate:(id<LegacyFullscreenControllerDelegate>)delegate
webState:(web::WebState*)webState
sessionID:(NSString*)sessionID;
// Used to clear state maintained by the controller and de-register from
// notifications. After this call the controller cease to function and will
// clear its delegate.
- (void)invalidate;
// Shows or hides the header as directed by |visible|. If necessary the delegate
// will be called synchronously with the desired offset and animate set to YES.
// This method can be called when it is desirable to show or hide the header
// programmatically. It must be called when the header size changes.
- (void)moveHeaderToRestingPosition:(BOOL)visible;
// Disabling full screen will pull the header to visible and keep it there no
// matter what the scrollview is doing.
- (void)disableFullScreen;
// Enabling fullscreen will reverse the effect of a call to -disableFullScreen.
// The toolbar will stay on screen until a move pushes it out.
- (void)enableFullScreen;
// Skip next attempt to correct the scroll offset for the toolbar height. This
// is necessary when programatically scrolling down the y offset.
- (void)shouldSkipNextScrollOffsetForHeader;
// Updates the insets during animation.
- (void)setToolbarInsetsForHeaderOffset:(CGFloat)headerOffset;
// Set the content offset of the underlying UIScrollView so that the content
// is not hidden by the header. The header will be moved to its visible position
// without animation if it is not already fully visible.
- (void)moveContentBelowHeader;
@end
@interface LegacyFullscreenController (UsedForTesting)
// Enables/Disables the LegacyFullscreenController in tests. The unit tests do
// not set the delegate which is crucial for methods to work on the controller.
// This a temporary solution.
+ (void)setEnabledForTests:(BOOL)enabled;
@end
#endif // IOS_CHROME_BROWSER_UI_FULLSCREEN_LEGACY_FULLSCREEN_CONTROLLER_H_