blob: 92f18a11f8c09f5d6b850e0c6cfbfa3f3b6148ac [file] [log] [blame]
// Copyright 2012 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_NTP_NEW_TAB_PAGE_CONTROLLER_H_
#define IOS_CHROME_BROWSER_UI_NTP_NEW_TAB_PAGE_CONTROLLER_H_
#import <UIKit/UIKit.h>
#include <string>
#import "ios/chrome/browser/ui/native_content_controller.h"
#import "ios/chrome/browser/ui/ntp/new_tab_page_bar.h"
#import "ios/chrome/browser/ui/ntp/new_tab_page_panel_protocol.h"
#import "ios/chrome/browser/ui/toolbar/toolbar_owner.h"
#import "ios/public/provider/chrome/browser/voice/logo_animation_controller.h"
namespace ios {
class ChromeBrowserState;
}
namespace NewTabPage {
enum PanelIdentifier {
kNone,
kMostVisitedPanel,
kBookmarksPanel,
kOpenTabsPanel,
kIncognitoPanel,
};
// Converts from a NewTabPage::PanelIdentifier to a URL #fragment
// and vice versa.
PanelIdentifier IdentifierFromFragment(const std::string& fragment);
std::string FragmentFromIdentifier(PanelIdentifier panel);
} // namespace NewTabPage
@class BookmarkHomeTabletNTPController;
@protocol CRWSwipeRecognizerProvider;
@class GoogleLandingViewController;
@protocol NewTabPagePanelProtocol;
@protocol OmniboxFocuser;
@class TabModel;
@protocol WebToolbarDelegate;
@protocol UrlLoader;
// This protocol provides callbacks for when the NewTabPageController changes
// panels.
@protocol NewTabPageControllerObserver
// The current visible panel has changed.
- (void)selectedPanelDidChange;
@end
// A controller for the New Tab Page user interface. Supports multiple "panels",
// each with its own controller. The panels are created lazily.
//
// The strongly retained instance variables |*Controller_| are instances of
// subclasses of NewTabPagePanelProtocol that are created lazily.
// Each Panel is its own controller with the accessible views are added to the
// |ntpView_|.
//
// newTabPageView_ is a horizontally scrollable view that contains the
// *PanelController instances available to the user at the moment. A tab-page
// bar inside |ntpView| provides direct access to the *PanelControllers on the
// scrollable view.
//
// The currently visible *PanelController is accessible through
// |currentController_|.
//
@interface NewTabPageController
: NativeContentController<LogoAnimationControllerOwnerOwner,
NewTabPageBarDelegate,
NewTabPagePanelControllerDelegate,
ToolbarOwner,
UIGestureRecognizerDelegate,
UIScrollViewDelegate>
@property(nonatomic, weak) id<CRWSwipeRecognizerProvider>
swipeRecognizerProvider;
// Init with the given url (presumably "chrome://newtab") and loader object.
// |loader| may be nil, but isn't retained so it must outlive this controller.
// Dominant color cache is passed to bookmark controller only, to optimize
// favicon processing.
- (id)initWithUrl:(const GURL&)url
loader:(id<UrlLoader>)loader
focuser:(id<OmniboxFocuser>)focuser
ntpObserver:(id<NewTabPageControllerObserver>)ntpObserver
browserState:(ios::ChromeBrowserState*)browserState
colorCache:(NSMutableDictionary*)colorCache
webToolbarDelegate:(id<WebToolbarDelegate>)webToolbarDelegate
tabModel:(TabModel*)tabModel
parentViewController:(UIViewController*)parentViewController
dispatcher:(id)dispatcher;
// Select a panel based on the given |panelType|.
- (void)selectPanel:(NewTabPage::PanelIdentifier)panelType;
// Returns |YES| if the current visible controller should show the keyboard
// shield.
- (BOOL)wantsKeyboardShield;
// Returns |YES| if the current visible controller allows showing the location
// bar hint text.
- (BOOL)wantsLocationBarHintText;
@end
#pragma mark - Testing
@class NewTabPageView;
@interface NewTabPageController (TestSupport)
@property(nonatomic, strong) NewTabPageView* ntpView;
- (id<NewTabPagePanelProtocol>)currentController;
- (BookmarkHomeTabletNTPController*)bookmarkController;
- (GoogleLandingViewController*)googleLandingController;
- (id<NewTabPagePanelProtocol>)incognitoController;
@end
#endif // IOS_CHROME_BROWSER_UI_NTP_NEW_TAB_PAGE_CONTROLLER_H_